Примерно через один день копания я нашел способ сделать это:
set error_=0
9>&1 1>&2 2>&9 (for /f "delims=" %%i in ('9^>^&1 1^>^&2 2^>^&9 ^(^(^(2^>^&1 call "%homeDir%%1"^) ^|^| ^(1^>^&2 2^>nul echo FAILED^)^) ^| 2^>nul "%homeDir%mtee" /T /+ "%homeDir%logs\%date_%_%1.log"^)') do (set error_=1))
exit /b %error_%
В приведенном выше примере выполняется «% homeDir %% 1», а его вывод передается по каналу «% homeDir% mtee». Эта строка обнаруживает сбои (я бы предложил вам нарисовать диаграмму пакетных контекстов и их назначений stdin / stdout / stderr, чтобы понять, что он делает :-)). Я не нашел хорошего способа извлечь фактический уровень ошибки. Лучшее, что я получил, это заменил команду 'echo' на какой-нибудь пакетный скрипт call 'call rc.bat', который выглядит так:
@echo %errorlevel%
и затем замените «set error_ = 1» на «set error _ = %% i».
Но проблема в том, что этот вызов тоже может быть неудачным, и это нелегко обнаружить. Тем не менее, это намного лучше, чем ничего - я не нашел никакого решения для этого в Интернете.