アプリ版:「スタンプのみでお礼する」機能のリリースについて

Windowsコマンドプロンプト(cmd)で、以下のコマンドにて環境変数の内容の置換ができますが、

set TEST1=ABC
echo %TEST1:A=C%
CBC

"%"で置換するというのはどのようにすればできますでしょうか?
例えば上記の"ABC"の文字列を"A%C"にしたいような場合です。

コマンドプロンプトの動作仕様の訳分からなさに辟易しております…
ご存知の方などいらっしゃいますでしょうか?

A 回答 (5件)

なぜかこうはできました


C:\Windows\system32>set TEST1=ABC

C:\Windows\system32>echo %TEST1:ABC=%A%C
A%C

この回答への補足

No2への補足入力ですが、一度入力すると再度編集・追記できないクソ仕様なので、ここに記入させていただきます

sh版のロジックは既に作成してあるので、cygwinが使えれば速攻解決なのですが、cygwinが使用できない環境でも
利用できるようにバッチで作成しようとしています。

遅延環境変数の展開など、shの知識でコーディングをしていると確実にはまりますね…
DOS時代の簡易機能から増改築を繰り返した名残でしょうか!?

補足日時:2010/12/22 06:45
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
残念ながら、No3さんの回答の通りなようです…

お礼日時:2010/12/22 06:47

自分も何度か挑戦した事があります。



例えば、DOSではエスケープするのに "^"(キャレット)を使うので、それを試してみたりとか。

で、結果としては、頓挫しました。
多分、無理ではないかと思っています。

代替案としては。

何かユーティリティをインストールしてもよい環境なら
→cygwinなどを入れて tr や sed, awk , perl などを使う。

インストールが許されない環境なら
→VBScriptなどでReplace関数で置換するバッチを作って代替。

ex) cygwin の tr.exe
set TEST1=ABC
echo %TEST1% | tr B %
A%C

この回答への補足

いろいろ検索してみました

元ネタ
http://fdays.blogspot.com/2007/11/blog-post.html


@echo

set before=ABC
set search=B
set replace=%%
set after=
set replace_wk=

:loop
if "%before%" == "" goto :end
for /f "tokens=1* delims=%search%" %%A in ("%before%") do (
  set after=%after%%replace_wk%%%A
  set before=%%B
  set replace_wk=%replace%
)
goto :loop

:end
echo %after%


実行結果

A%C


なんか泣けてくる…

補足日時:2010/12/22 06:32
    • good
    • 0
この回答へのお礼

ありがとうございます。
私も "^"(キャレット)を試して玉砕しました。
単純に次の%を探してそこを範囲終了と見なすような動きです
中途半端な仕様ですね…

お礼日時:2010/12/22 06:34

#1 さんの回答にダウト。


(ごめんなさい)

>echo %TEST1:ABC=%A%C

これは %TEST1:ABC=% で空文字ができて、その後ろに A%C があるため、結果として A%C になっているだけですね。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございました。

お礼日時:2011/03/20 12:00

環境変数の遅延展開を使用すれば置換できます。



こんな感じです。XP Proで動作確認しました。

setlocal ENABLEDELAYEDEXPANSION
set TEST1=ABC
set TEST2=!TEST1:B=%%!
echo %TEST2%
    • good
    • 6
この回答へのお礼

ありがとうございます。たしかにこれでいけそうです!!

同様なことを一行ずつの実行でコマンドプロンプトで試していたのですが、
それだとうまくいかなかったので諦めていました。
バッチファイルとして実行させるとうまくいくようですね…

遅延環境変数を使うと"%"が区切り用の文字と判定されなくなるのが
おもしろいところですね。

お礼日時:2010/12/22 21:04

#2,3です。



すいません。回答ではないのですが、#4 さんの回答、素晴らしいですね!
なるほど遅延展開って、こう使うんだ。

おかげで私も長年のモヤモヤを晴らせました。
ありがとうございます。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています