パイプ前段のERRORLEVEL

ちょっとよくわからないこと。

setlocal enabledelayedexpansion
set A=123
echo !A!             → 当然 123 と表示
(echo !A!)           → これも 123 と表示
echo !A! | more      → これも 123 と表示
(echo !A!) | more    → なぜか !A! と表示

パイプの要素でカッコで囲んだ場合だけ、setlocal の影響が及ばないようである。

ということで、パイプ前段の ERRORLEVEL を知りたい場合、

setlocal enabledelayedexpansion
( prog1 & echo exit /b !ERRORLEVEL! > tmp.bat ) | prog2
call tmp.bat
echo %ERRORLEVEL%

では駄目で、

cmd /v:on /c "prog1 & echo exit /b !ERRORLEVEL! > tmp.bat" | prog2
call tmp.bat
echo %ERRORLEVEL%

とする必要がある。