• ベストアンサー

Windowsコマンドプロンプトで環境変数の%置換

Windowsコマンドプロンプト(cmd)で、以下のコマンドにて環境変数の内容の置換ができますが、 set TEST1=ABC echo %TEST1:A=C% CBC "%"で置換するというのはどのようにすればできますでしょうか? 例えば上記の"ABC"の文字列を"A%C"にしたいような場合です。 コマンドプロンプトの動作仕様の訳分からなさに辟易しております… ご存知の方などいらっしゃいますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.4

環境変数の遅延展開を使用すれば置換できます。 こんな感じです。XP Proで動作確認しました。 setlocal ENABLEDELAYEDEXPANSION set TEST1=ABC set TEST2=!TEST1:B=%%! echo %TEST2%

tomoarai
質問者

お礼

ありがとうございます。たしかにこれでいけそうです!! 同様なことを一行ずつの実行でコマンドプロンプトで試していたのですが、 それだとうまくいかなかったので諦めていました。 バッチファイルとして実行させるとうまくいくようですね… 遅延環境変数を使うと"%"が区切り用の文字と判定されなくなるのが おもしろいところですね。

その他の回答 (4)

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.5

#2,3です。 すいません。回答ではないのですが、#4 さんの回答、素晴らしいですね! なるほど遅延展開って、こう使うんだ。 おかげで私も長年のモヤモヤを晴らせました。 ありがとうございます。

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.3

#1 さんの回答にダウト。 (ごめんなさい) >echo %TEST1:ABC=%A%C これは %TEST1:ABC=% で空文字ができて、その後ろに A%C があるため、結果として A%C になっているだけですね。

tomoarai
質問者

お礼

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

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.2

自分も何度か挑戦した事があります。 例えば、DOSではエスケープするのに "^"(キャレット)を使うので、それを試してみたりとか。 で、結果としては、頓挫しました。 多分、無理ではないかと思っています。 代替案としては。 何かユーティリティをインストールしてもよい環境なら →cygwinなどを入れて tr や sed, awk , perl などを使う。 インストールが許されない環境なら →VBScriptなどでReplace関数で置換するバッチを作って代替。 ex) cygwin の tr.exe set TEST1=ABC echo %TEST1% | tr B % A%C

tomoarai
質問者

お礼

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

tomoarai
質問者

補足

いろいろ検索してみました 元ネタ 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)
回答No.1

なぜかこうはできました C:\Windows\system32>set TEST1=ABC C:\Windows\system32>echo %TEST1:ABC=%A%C A%C

tomoarai
質問者

お礼

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

tomoarai
質問者

補足

No2への補足入力ですが、一度入力すると再度編集・追記できないクソ仕様なので、ここに記入させていただきます sh版のロジックは既に作成してあるので、cygwinが使えれば速攻解決なのですが、cygwinが使用できない環境でも 利用できるようにバッチで作成しようとしています。 遅延環境変数の展開など、shの知識でコーディングをしていると確実にはまりますね… DOS時代の簡易機能から増改築を繰り返した名残でしょうか!?

関連するQ&A

  • コマンドプロンプトからのcmd実行について

    現在VBSでオブジェクトを定義しrunを使いcmd経由で他のバッチ・VBS・ソフトの起動をやっています。 ふととあるパスが実行できませんでした。 そこで別途個別にコマンドプロンプトだけで実行してみましたがやはりうまく処理できません。 [echo.bat] echo test pause [コマンドプロンプト] rem その1 cmd /K c:\temp\a\echo.bat rem その2 cmd /K C:\Temp\(a\echo.bat その1の結果 C:>cmd /K C:\Temp\a\echo.bat C:>echo test test C:>pause 続行するには何かキーを押してください . . . その2の結果 C:>cmd /K C:\Temp\(a\echo.bat 'C:\Temp\' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 C:> 上記のように1は正常に処理され2はうまく処理されません。 解決策をひたすら検索したのですが見つからず なんとなくだいたい分かったのが一部『(』や『)』や『&』や『@』や『^』などの記号が混じるとどうやらうまく処理できないようです。 なぜ処理できないのか?と、如何すればこれを回避して実行できるか分かる方がいればよろしくお願いします。 備考: (現状の緊急回避として記号のあるパスは記号のないパスから経由batを生成する方法を思いつきましたが自分で馬鹿だと思います) (経由バッチの中身が"C:\Temp\(a\echo.bat"ならば実行できるから) また、cmd /K "C:\Temp\(a\echo.bat" では実行できませんでした。 OSはXPです。コマンドプロンプトヴァージョンは(Microsoft Windows XP [Version 5.1.2600])です

  • sedで置換した値を変数にセットしたい。

    sedで置換した値を変数にセットしたい。 次のように変数aaにセットした文字列「abc」を「abd」に置換して、再度変数aaにセットしたいのですがうまくいきません。 # aa=abc # aa=`echo $aa | sed -e 's/c/d/'` sed: -e 表現 #1, 文字数 5: 「s」コマンドが終了していません # 宜しくお願いします。

  • sedで置換した値を変数にセットしたい。

    sedで置換した値を変数にセットしたい。 次のように変数aaにセットした文字列「abc」を「abd」に置換して、再度変数aaにセットしたいのですがうまくいきません。 # aa=abc # aa=`echo $aa | sed -e 's/c/d/'` sed: -e 表現 #1, 文字数 5: 「s」コマンドが終了していません # 宜しくお願いします。

  • コマンドプロンプトの環境変数

    『コントロールパネル』→『システム』→『システムのプロパティ』→『詳細』タブ→『環境変数』→『システム環境変数』で設定した環境変数が、 "C:\WinNT\System32\CMD.EXE"を起動して、 "SET"コマンドで環境変数を確認すると設定された値と違っています。 何故でしょうか?

  • コマンドプロンプト

    スタートメニューのアクセサリからコマンドプロンプトを実行すると C:\WINDOWS\system32\cmd.exe ReadProcessMemory要求または WriteProcessMemory要求の一部だけを完了しました。 と出てコマンドプロンプトが起動されないんですがどうすればいいんでしょうか?

  • バッチファイルで環境変数が設定されません

    よろしくお願いいたします。 Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。 command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。 cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。 なぜ command.com 上のバッチから操作できないのかわからず、不便でかないません。 アドバイスをよろしくお願いいたします。 @echo off set foo=word path=c:\ echo %foo% echo %path% 上記バッチを実行すると word c:\ と表示されますが、set コマンドで確認すると FOO は存在しません PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;... と表示されます。 これはバッチ実行前の値です。

  • windowsコマンドプロンプトにて。

    windowsコマンドプロンプトについての質問なんですが。 自分は今、学生でLinux(OS)を主に使っていて、JAVAを勉強中です。 それで、Linuxではviコマンドでなんとかファイル編集などが容易にできるのですが、コマンドプロンプトの場合は、mdとechoを使ってファイル作成をするだけで、どうやって編集すればいいのかわかりません。 なので、編集できるコマンド!又は方法を知ってる方は教えてください。 JAVA環境は整えました。

  • コマンドプロンプトはC:\WINDOWS\system32\cmd.exe ?

    いつもアクセサリ⇒コマンドプロンプトで起動していたのですが、ふとコマンドプロンプトってなんだろう、と思ったのですが、C:\WINDOWS\system32\cmd.exeを起動しているということなのでしょうか? そして、このプログラムのなかに、例えばipconfigのような機能(?)が用意されている、ということなのでしょうか? よろしくお願いします。

  • コマンドプロンプトが起動できない

    コマンドプロンプトを起動するため、スタート->ファイル名を指定して実行 より「cmd」と実行したところ、通常の場合コマンドプロンプトが開くはずか 以下のようなエラーがポップアップダイアログに表示されました。 なぜか「cmd.com」になっています。 cmd.exedと入力するとコマンドプロンプトは正常に表示されました。 16 ビット MS-DOS サブシステム C:WINDOWS\system32\cmd.com NTVDM CPU は不正命令を検出しました。 CS:0002 OP:0f 02 f0 06 04 アプリケーションを終了するには、「閉じる」を選んでください。 [閉じる(C)] [無視(I)] 何かウィルスか何かによって攻撃されたのでしょうか? 宜しくお願いいたします。

  • コマンドプロンプトが使えなくなった

    コマンドプロンプトが使えなくなりました。cgwinをインストールして、最近それをアンインストールしました。環境変数の中のdllを誤って消してしまったと思うのですが、回復することはできますか? 現状は、以下の環境変数とあとTEMPなどの環境変数が4つあります。 不足しているものがありますか?教えてください。 ComSpec SystemRoot%\system32\cmd.exe NUMBER_OF_PROCESSORS 1 Os Windows_NT Path C:\Program Files\Java\jdk1.5.0_07\bin PathEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH PROCESSOR_ARCHITECTURE x86 PROCESSOR_IDENTIFIER x86 Family 15 Model 1 Stepping 3, GenuineIntel