2010-05-18 13 views
10

jest to możliwe, do zwrotu errorlevel także jeśli rura wyjście skryptu do pliku dziennika:plik wsadowy Windows: Rura niszczy mój kod zwrotny

test1.bat:

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

test2.bat:

exit /B 1 

Wyjście dzwoniąc test1.bat:

ERRORLEVEL: 0 

errorlevel jest zawsze 0.

Problem polega na tym, chcę zadzwonić inny skrypt wewnątrz mojego skryptu gdzie wyjście powinno być przekierowany synchronicznie z wyjściem przedstawionym w wierszu polecenia, zatem prosty > nie wystarcza dla mnie. Próbowałem kilka pomysłów, ale wynik jest taki, że rura zawsze wydaje się zniszczyć daną błędzie poziomie ... :(

Czy możesz dać mi jakieś dalsze sugestie?

Z góry dzięki ... :)


Dzięki za odpowiedź ... Niestety to nie działa tak dobrze ... :(Zobacz co starałem:

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 

Wyjście Dzwoniąc test1.bat:

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

Jako inne rozwiązanie starałem się oszczędzać "ERRORVALUE: 1" w pliku dziennika w przypadku wystąpienia błędu. W tekście głównym chciałbym przetworzyć dziennik szukający tego ciągu. Niestety zapisywania Find-wynik do zmiennej środowiskowej nie działa tak dobrze, ja w następujący sposób:

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

Błąd pojawia się:

"|" ist syntaktisch an dieser Stelle nicht verarbeitbar. 

Więc jak mogę przynajmniej przeanalizować moje logfile aw przypadku znalezienia łańcucha znaków w dzienniku mogę zwrócić wartość jako poziom błędu?

+0

bardzo pokrewne: http://stackoverflow.com/questions/11170753/windows-command-interpreter-how-to-obtain-exit-code-of-first -piped-command – eckes

Odpowiedz

1

Problem polega na tym, że tee wychodzi z pliku po, a jego własny kod wyjścia zastępuje plik wsadowy.

Jest (według mojej wiedzy) niewiele na to można poradzić, z wyjątkiem użycia innego mechanizmu obsługi błędów. Możesz użyć zmiennej środowiskowej do przechowywania kodu zakończenia twojej partii. tee tego nie dotknie.

1

Jak o:

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

Nasty. Mogę tylko zaproponować plik wsadowy opakowania, który wiewiórkuje kod zakończenia przekazanego polecenia. Zmienna środowiskowa nie zmniejszy tu jeszcze musztardy. Proponuję pisząc go do nieużywanego fd, powiedzmy 4.

wr.cmd:

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

Jest to nieco trudne, ponieważ fd 4 muszą być otwarte, gdy wr.cmd nazywa. Aby przetestować sake, tutaj echo Some error message na stderr, aby pokazać, że taki tekst pozostaje oddzielony od poziomu błędu.

test1.bat:

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