パイプにつないだとあるコマンドの終了コードを読みたい。
しかし、パイプ後の %errorlevel%
の中身は、パイプ先の最後のコマンドの終了コードになる。
また、パイプの中身は独立したプロセスになっているようで、この中でいくら環境変数の設定を行っても、消えてしまうのだ。
…となっては仕方ない、いったん一時ファイルに書き出した後、その値を読み出すしかない。
set tmplog=%TEMP%\errlv_%DATE:/=%%RANDOM%%RANDOM%.log
(cd d:\nonexist & call echo %^^errorlevel% ^>"%tmplog%") | sort
for /f "usebackq" %A in ("%tmplog%") do echo result %A
del "%tmplog%"
パイプの呼び出し時と、all echo
時、そして実行時の 合計 3回 環境変数の展開が行われるので、最初の2回分を キャレットで回避しているのがミソ。
ちなみに、cd d:\nonexist
は、フォルダが存在しない場合に errorlevel が返されるのを利用したもので、 sort
はパイプで文字を受け取るデモになっている。(一行だけなので意味は無いけど…)
ただし、バッチファイルに書くときは、以下の様に %
を重ねて書かなくてはならないので注意。
set tmplog=%TEMP%\errlv_%DATE:/=%%RANDOM%%RANDOM%.log
(cd d:\nonexist & call echo %%^^errorlevel%% ^>"%tmplog%") | sort
for /f "usebackq" %%A in ("%tmplog%") do echo result %%A
del "%tmplog%"