2010-05-18 5 views
10

ist es möglich, die Fehlerebene auch wenn ich Rohr der Ausgabe eines Skripts in eine Log-Datei zurück:Windows-Batch-Datei: Rohr zerstört mein Rückgabecode

test1.bat:

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

test2.bat:

exit /B 1 

Ausgang beim Aufruf test1.bat:

ERRORLEVEL: 0 

Der Errorlevel ist immer 0.

Das Problem ist, möchte ich ein anderes Skript in meinem Skript aufrufen, wo die Ausgabe mit der Ausgabe in der Befehlszeile angezeigt, also eine einfache synchron umgeleitet werden soll > ist nicht genug für mich. Ich habe versucht, einige Ideen, aber Ergebnis ist, dass das Rohr immer den gegebenen Fehler-Level zu zerstören scheint ... :(

Können Sie mir weitere Vorschläge geben?

Vielen Dank im Voraus ... :)


Vielen Dank für Ihre Antwort ... Leider ist dies auch nicht ... :(sehen Sie, was ich versucht:

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 

Ausgabe, wenn test1.bat Aufruf:

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

Als andere Lösung, die ich versuchte, "ERRORVALUE: 1" speichern in das Logfile, falls es einen Fehler gibt. Im Hauptbuch wollte ich das Protokoll analysieren, um nach dieser Zeichenfolge zu suchen. Leider ist der Fund-Ergebnis in eine Umgebungsvariable Einsparung auch nicht funktioniert, habe ich wie folgt:

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

Fehler erhalte ich:

"|" ist syntaktisch an dieser Stelle nicht verarbeitbar. 

So wie kann ich zumindest meine Logfile analysieren und in Wenn die Zeichenfolge im Protokoll gefunden wird, kann ich den Wert als Errorlevel zurückgeben?

+0

sehr ähnlich: http://stackoverflow.com/questions/11170753/windows-command-interpreter-how-to-obtain-exit-code-of-first -Piped-Befehl – eckes

Antwort

1

Nun, das Problem ist, dass tee Exits nach Ihre Batch-Datei und damit einen eigenen Exit-Code überschreibt die eine der Batch-Datei.

Es gibt (soweit ich weiß) nicht viel, was Sie dagegen tun können, außer dass Sie einen anderen Fehlerbehandlungsmechanismus verwenden. Sie können eine Umgebungsvariable verwenden, um den Exit-Code Ihres Stapels zu speichern. tee wird das nicht berühren.

1

Wie wäre:

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

Nasty. Ich kann nur eine Wrapper-Batch-Datei vorschlagen, die den Exit-Code eines übergebenen Befehls entfernt. Eine Umgebungsvariable wird hier nicht den Senf schneiden. Ich schlage vor, es zu einem nicht verwendeten fd schreiben, sagen 4.

wr.cmd:

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

Dies als fd etwas heikel ist 4 muss offen sein, wenn wr.cmd genannt wird. Um dies zu überprüfen, gebe ich hier Some error message an stderr zurück, um zu zeigen, dass dieser Text von der Fehlerstufe getrennt bleibt.

test1.bat:

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