【问题标题】:Windows batch file: Pipe destroys my return codeWindows 批处理文件:管道破坏了我的返回码
【发布时间】:2010-05-18 13:14:40
【问题描述】:

如果我将脚本的输出通过管道传输到日志文件中,是否也可以返回错误级别:

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%

测试2:

 @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.

那么我怎样才能至少解析我的日志文件,如果在日志中找到字符串,我可以将值作为错误级别返回?

【问题讨论】:

标签: batch-file cmd


【解决方案1】:

恶心。我只能建议一个包装批处理文件,它将传递命令的退出代码隐藏起来。环境变量不会在这里完全消除芥末。我建议将其写入未使用的 fd,例如 4。

wr.cmd

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

这有点棘手,因为在调用 wr.cmd 时必须打开 fd 4。为了测试起见,这里我将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%

【讨论】:

    【解决方案2】:

    嗯,问题是tee 在您的批处理文件之后退出,因此它自己的退出代码会覆盖批处理文件中的那个。

    除了使用另一种错误处理机制外,(据我所知)您对此无能为力。您可以使用环境变量来存储批处理的退出代码。 tee 不会碰那个。

    【讨论】:

      【解决方案3】:

      怎么样:

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

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 2014-05-28
        相关资源
        最近更新 更多