Windows コマンドプロンプトで、パイプでつないだコマンドの終了コードを取得

Pocket

パイプにつないだとあるコマンドの終了コードを読みたい。

しかし、パイプ後の %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%"

コメントを残す

メールアドレスが公開されることはありません。