开发者

Windows batch file: Pipe destroys my return code

开发者 https://www.devze.com 2022-12-30 22:27 出处:网络
is it possible to return the errorlevel also if I pipe the output of a script into a logfile: test1.bat:

is it possible to return the errorlevel also if I pipe the output of a script into a logfile:

test1.bat:

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

test2.bat:

 exit /B 1

Output when calling test1.bat:

 ERRORLEVEL: 0

The errorlevel is al开发者_JAVA百科ways 0.

The problem is, I want to call another script inside my script where the output should be redirected synchronously with the output shown in the command line, therefore a simple > is not enough for me. I tried several ideas, but result is that the pipe always seems to destroy the given error-level... :(

Can you give me any further suggestions?

Thanks in advance... :)


Thanks for your answer... Unfortunately this does not work as well... :( See what I tried:

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

Output when calling test1.bat:

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

As an other solution I tried to save "ERRORVALUE: 1" into the logfile in case there is an error. In the mainscript I wanted to parse the log looking for this string. Unfortunately saving the find-result to an environment variable does not work as well, I did as follows:

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

Error I get:

"|" ist syntaktisch an dieser Stelle nicht verarbeitbar.

So how can I at least parse my logfile and in case the string is found in the log I can return the value as an errorlevel?


Nasty. I can only suggest a wrapper batch file that squirrels away the exit code of a passed command. An environment variable won't quite cut the mustard here. I suggest writing it to an unused fd, say 4.

wr.cmd:

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

This is slightly tricky as fd 4 must be open when wr.cmd is called. For testing sake, here I echo Some error message to stderr to show that such text remains separate from the error level.

test1.bat:

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


Well, the problem is that tee exits after your batch file and therefore its own exit code overwrites the one of the batch file.

There's (to my knowledge) not much you can do about that, except use another error handling mechanism. You can use an environment variable to store the exit code of your batch. tee won't touch that.


How about:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号