Пакетный файл Windows: труба разрушает мой код возврата

возможно ли вернуть уровень ошибок также, если я передам вывод script в файл журнала:

test1.bat:

 call test2.bat 2>&1 | tee log.txt
 echo ERRORLEVEL: %ERRORLEVEL%

test2.bat:

 exit /B 1

Вывод при вызове test1.bat:

 ERRORLEVEL: 0

Уровень ошибок всегда равен 0.

Проблема заключается в том, что я хочу вызвать еще один script внутри моего script, где вывод должен быть перенаправлен синхронно с выходом, указанным в командной строке, поэтому для меня это просто > . Я пробовал несколько идей, но результат в том, что труба всегда, кажется, уничтожает данный уровень ошибки...: (

Можете ли вы дать мне дополнительные предложения?

Спасибо заранее...:)


Спасибо за ваш ответ... К сожалению, это не работает...:( Смотрите, что я пробовал:

test1.bat:

 echo off
 set VAR1=" "
 echo VAR1 before test2: %VAR1%
 call test2.bat 2>&1 | tee log.txt
 echo VAR1 after test2: %VAR1%

test2:

 @echo off
 set VAR1=ERROR
 echo VAR1 in test2: %VAR1%
 exit /B 1

Вывод при вызове test1.bat:

 VAR1 before test2: " "
 VAR1 in test2: ERROR
 VAR1 after test2: " "

В качестве другого решения я попытался сохранить "ERRORVALUE: 1" в файле журнала в случае возникновения ошибки. В основном тексте я хотел проанализировать журнал, который ищет эту строку. К сожалению, сохранение результата поиска в переменной окружения не работает, я сделал следующее:

FOR /F "tokens=1 delims=" %%A in ('type %logDir%\03_applySqls.log | find /c "ERRORVALUE: 1"') do SET val=%%A

Ошибка:

"|" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Итак, как я могу хотя бы разобрать мой файл журнала, и если строка найдена в журнале, я могу вернуть значение как уровень ошибок?

Ответ 1

Насти. Я могу предложить только пакетный файл оболочки, который бежит от кода выхода переданной команды. Переменная окружения не будет полностью вырезать горчицу здесь. Я предлагаю записать его неиспользуемому fd, скажем 4.

wr.cmd

call %*
echo %errorlevel% >&4
echo Some error message >&2

Это немного сложно, поскольку fd 4 должен быть открыт при вызове wr.cmd. Для тестирования ради, здесь я эхо Some error message в stderr, чтобы показать, что такой текст остается отдельным от уровня ошибки.

test1.bat

call wr test2.bat 4>fail.txt 2>&1 | tee log.txt
set /p fail= <fail.txt
echo FAIL: %fail%

Ответ 2

Ну, проблема в том, что tee завершается после вашего пакетного файла, и поэтому его собственный код выхода перезаписывает один из пакетного файла.

Там (насколько мне известно) вы не можете это сделать, кроме использования другого механизма обработки ошибок. Вы можете использовать переменную среды для хранения кода выхода вашей партии. tee не коснется этого.

Ответ 3

Как насчет:

FOR /F "tokens=1 delims=" %%A in ('find /c "ERRORVALUE: 1" %logDir%\03_applySqls.log') do SET val=%%A