- ベストアンサー
Windowsコマンドプロンプトで環境変数の%置換
Windowsコマンドプロンプト(cmd)で、以下のコマンドにて環境変数の内容の置換ができますが、 set TEST1=ABC echo %TEST1:A=C% CBC "%"で置換するというのはどのようにすればできますでしょうか? 例えば上記の"ABC"の文字列を"A%C"にしたいような場合です。 コマンドプロンプトの動作仕様の訳分からなさに辟易しております… ご存知の方などいらっしゃいますでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
環境変数の遅延展開を使用すれば置換できます。 こんな感じです。XP Proで動作確認しました。 setlocal ENABLEDELAYEDEXPANSION set TEST1=ABC set TEST2=!TEST1:B=%%! echo %TEST2%
その他の回答 (4)
- utakataXEX
- ベストアンサー率69% (711/1018)
#2,3です。 すいません。回答ではないのですが、#4 さんの回答、素晴らしいですね! なるほど遅延展開って、こう使うんだ。 おかげで私も長年のモヤモヤを晴らせました。 ありがとうございます。
- utakataXEX
- ベストアンサー率69% (711/1018)
#1 さんの回答にダウト。 (ごめんなさい) >echo %TEST1:ABC=%A%C これは %TEST1:ABC=% で空文字ができて、その後ろに A%C があるため、結果として A%C になっているだけですね。
お礼
ご指摘ありがとうございました。
- utakataXEX
- ベストアンサー率69% (711/1018)
自分も何度か挑戦した事があります。 例えば、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 なんか泣けてくる…
- DI_evaWKO
- ベストアンサー率46% (7/15)
なぜかこうはできました C:\Windows\system32>set TEST1=ABC C:\Windows\system32>echo %TEST1:ABC=%A%C A%C
お礼
ご回答ありがとうございます。 残念ながら、No3さんの回答の通りなようです…
補足
No2への補足入力ですが、一度入力すると再度編集・追記できないクソ仕様なので、ここに記入させていただきます sh版のロジックは既に作成してあるので、cygwinが使えれば速攻解決なのですが、cygwinが使用できない環境でも 利用できるようにバッチで作成しようとしています。 遅延環境変数の展開など、shの知識でコーディングをしていると確実にはまりますね… DOS時代の簡易機能から増改築を繰り返した名残でしょうか!?
お礼
ありがとうございます。たしかにこれでいけそうです!! 同様なことを一行ずつの実行でコマンドプロンプトで試していたのですが、 それだとうまくいかなかったので諦めていました。 バッチファイルとして実行させるとうまくいくようですね… 遅延環境変数を使うと"%"が区切り用の文字と判定されなくなるのが おもしろいところですね。