在下面提供的例子中,我执行NMAKE,然后重定向STDOUT / STDERR发球,然后将其发送到屏幕,并且还到一个日志文件。 问题是,我试图捕捉NMAKE而不是发球退出代码。 我需要的是从NMAKE的退出代码,而不是发球。
nmake | tee output.txt
在下面提供的例子中,我执行NMAKE,然后重定向STDOUT / STDERR发球,然后将其发送到屏幕,并且还到一个日志文件。 问题是,我试图捕捉NMAKE而不是发球退出代码。 我需要的是从NMAKE的退出代码,而不是发球。
nmake | tee output.txt
你可能会认为你可以不喜欢以下,但它不会工作。
(nmake & call set myError=%%errorlevel%%) | tee output.txt
问题就出在由Windows管道的工作机制。 管道的每一侧在它自己的CMD外壳执行。 所以,你设置任何环境变量,一旦命令完成就会消失。 也%ERRORLEVEL%的延迟扩展是更加复杂,因为解析的额外水平,并且由于CMD壳具有命令行上下文,而不是分批上下文。
你可以这样做:
(nmake & call echo %%^^errorlevel%% ^>myError.txt) | tee output.txt
for /f %%A in (myError.txt) do echo nmake returned %%A
del myError.txt
或者你可以嵌入在你的output.txt的ERRORLEVEL:
(nmake & call echo nmakeReturnCode: %%^^errorlevel%%) | tee output.txt
for /f "tokens=2" %%A in ('findstr /b "nmakeReturnCode:" output.txt') do echo nmake returned %%A
但是,最简单的办法似乎是
nmake >output.txt
set myError=%errorlevel%
type output.txt
echo nmake returned %myError%
注 -有许多细微的并发症与Windows管道工作时。 一个很好的参考是为什么延迟扩展码的管道块内部时失败? 。 我建议你阅读问题和所有的答案。 所选择的答案有最好的信息,但对方的回答可以帮助提供上下文。
编辑2015年6月2日
我最近发现可以使用DOSKEY宏干净地存储和检索从管道的任一个(或两者)两侧的错误级别,而不诉诸临时文件。 我从DosTips用户埃德Dyreen的想法http://www.dostips.com/forum/viewtopic.php?p=41409#p41409 。 DOSKEY宏无法通过批量执行,但ENDLOCAL和CMD / C退出后的定义仍然存在!
这里是你将如何使用它在您的情况:
(nmake & call doskey /exename=err err=%%^^errorlevel%%) | tee output.txt
for /f "tokens=2 delims==" %%A in ('doskey /m:err') do echo nmake returned %%A
如果你愿意,你可以在最后添加一个命令来清除Err“宏”的定义已检索到的值之后。
doskey /exename=err err=