2010-05-18 46 views
10

是有可能還返回錯誤級別,如果我管一個腳本的輸出到一個日誌文件:的Windows批處理文件:管道破壞了我的返回碼

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. 

所以,我怎麼能至少解析我的日誌文件,然後在在日誌中發現字符串的情況下,我可以返回值作爲錯誤級別?

+0

很有關係:http://stackoverflow.com/questions/11170753/windows-command-interpreter-how-to-obtain-exit-code-of-first -piped命令 – eckes 2016-07-07 10:39:50

回答

1

好了,問題是,tee退出,因此其自身的退出代碼覆蓋批處理文件的一個您的批處理文件。

有(就我所知),你可以做的事情不多,除了使用另一個錯誤處理機制。您可以使用環境變量來存儲批次的退出代碼。 tee不會觸及那個。

1

如何:

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

討厭。我只能建議一個包裝器批處理文件,它使鬆散的命令退出代碼鬆動。環境變量不會在這裏完全切斷芥末。我建議將其寫入到一個未使用的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%