Пакетный файл Windows: Pipe уничтожает мой код возврата - PullRequest
10 голосов
/ 18 мая 2010

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

test1.bat:

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

test2.bat:

 exit /B 1

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

 ERRORLEVEL: 0

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

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

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

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


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

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.

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

Ответы [ 3 ]

2 голосов
/ 20 февраля 2013

Насти. Я могу только предложить пакетный файл-обертку, который сжимает код завершения переданной команды. Переменная окружения здесь не совсем подойдет. Я предлагаю записать это на неиспользованный 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%
1 голос
/ 18 сентября 2010

Как насчет:

FOR /F "tokens=1 delims=" %%A in ('find /c "ERRORVALUE: 1" %logDir%\03_applySqls.log') do SET val=%%A
1 голос
/ 18 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...