2010年7月8日木曜日

コマンドプロンプト(cmd.exe)で、標準出力されたコマンドの結果を変数に格納

linux シェルのコマンド置換をコマンドプロンプトで使いたいときに。。。

注意点

下記コマンド中の ❚(0x08) はコマンド列に含まれない制御文字などであればよくて ❚(0x08) をメモ帳で入力するなら CTRL+BACKSPACE。
※ 詳しくは [参考文献] の [制御コードの入力方法] 項目に記述した文献参照

Set コマンドで COMMAND 変数の内容を設定するときに、エスケープ(^)が必要な文字は 2重にエスケープする。
例えば & を echo させたい場合は ^^^& とする。

コマンド プロンプト
C:\>type stdin2var(1).cmd
@Echo off
Setlocal ENABLEDELAYEDEXPANSION
Set COMMAND=echo ;a b  cd;^^^&echo.""^^^>con:
For /F "usebackq tokens=* eol=❚" %%i IN (`!COMMAND!`) Do Set VAR=%%i
Echo !VAR!
Endlocal

C:\>stdin2var(1).cmd
;a b  cd;&echo."">con:

C:\>

コマンド文字列にダブルクォート(")を含まない場合は下記でもよいらしい。

コマンド プロンプト
C:\>type stdin2var(2).cmd
@Echo OFF
For /F "usebackq tokens=* eol=❚" %%i In (`"echo ;a^^^&echo."`) Do Set VAR=%%i
Echo %VAR%

C:\>stdin2var(2).cmd
;a&echo.

C:\>

確認

  • Windows XP SP3

参考文献

遅延評価を使った For /F 文の問題回避方法

  • Windows Script Programming -「FORコマンドのバグ?」
    http://scripting.cocolog-nifty.com/blog/2007/02/for_daa8.html

制御コードの入力方法

  • Windows Script Programming -「FOR /F の eol について」
    http://scripting.cocolog-nifty.com/blog/2008/02/for_f_eol_2f50.html