西海岸より

つらつらざつざつと

バッチファイルで環境変数にコマンドの実行結果を格納(複数行)

linuxのシェルだと

  val=`ls`

のように簡単にコマンドの実行結果を代入できるのだけれど、windowsのバッチの場合は工夫が必要。

  • ソース(onebatcmd.bat)
for /f "usebackq tokens=*" %%i in (`echo hoge`) do @set RESULT=%%i
echo %RESULT%

環境変数RESULTに「echo hoge」のコマンド実行結果を格納している。

  • 実行結果
C:\test\test100208>onebatcmd.bat
hoge

ただ、複数行が出力されるバッチの場合だと最後の行だけ出力されてしまう。。。

  • 実行結果(dirコマンドの場合)
C:\test\test100208>onebatcmd.bat
2 個のディレクトリ  34,733,789,184 バイトの空き領域

ということで、コマンドの結果すべての行を格納するスクリプトに修正。

  • ソース(batcmd.bat) 複数行対応
@echo off
setlocal enabledelayedexpansion
set RESULT=
for /f "usebackq tokens=*" %%i in (`dir`) do (
  set RESULT=!RESULT!^

%%i
)
echo !RESULT!
endlocal

ここではdirコマンドの実行結果をRESULTという環境変数に代入してます。

  • 実行結果
C:\test\test100208>batcmd.bat

ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 880C-7EF1 です
C:\test\test100208 のディレクトリ
2010/02/08  00:19    <DIR>          .
2010/02/08  00:19    <DIR>          ..
2010/02/08  00:22               162 batcmd.bat
1 個のファイル                 162 バイト
2 個のディレクトリ  34,736,750,592 バイトの空き領域

コマンドの実行結果の前後のスペースはトリムされてしまうのでご注意。(たぶん必要ないとは思うけれど)

とりあえず書けたのはよかったものの、なるべく使いたくないような気がする。

Windowsコマンドプロンプト スパテク242 Vista/XP/2000対応 (スパテクシリーズ)

Windowsコマンドプロンプト スパテク242 Vista/XP/2000対応 (スパテクシリーズ)