【问题标题】:%ERRORLEVEL% is not working incase multiple commands on a Single line%ERRORLEVEL% 不起作用,因为单行上有多个命令
【发布时间】:2015-01-23 00:23:39
【问题描述】:

我正在尝试以下命令并希望退出我的process(%ERRORLEVEL%)。但它返回previous(last) 执行的退出代码结果sample.exe。我想获取当前命令的退出代码。我的要求是在单行中执行多个命令*(不是批处理脚本)*。

命令:

cmd /c sample.bat "test" > c:\ouput.log & echo %ERRORLEVEL% > c:\returnCode.log

我什至尝试使用“setlocal enableDelayedExpansion”,如下所示。仍然没有返回当前命令的退出代码

cmd /c setlocal enableDelayedExpansion & sample.bat "test" > c:\ouput.log & echo %ERRORLEVEL% > c:\returnCode.log

请告诉我获取当前命令退出代码的方法。

【问题讨论】:

标签: windows batch-file command-line command command-prompt


【解决方案1】:
cmd /c sample.exe "test" > c:\ouput.log & call echo %%ERRORLEVEL%% > c:\returnCode.log

应该适合你。查看与delayedexpansion相关的无数SO项目

【讨论】:

  • 感谢您的回复。我尝试了上面的命令,它仍然在打印最后执行的命令退出代码。 cmd /c sample.bat "test" > c:\ouput.log & call echo %%ERRORLEVEL%% > c:\returnCode.log
  • 我相信我们在这里没有得到完整的故事。似乎没有理由在cmd 下运行sample.exe。我建议您阅读 stackoverflow.com/questions/27097252/… 。似乎正在发生的事情是cmd 正常终止而无需通过exit 设置退出代码(可能与XP/W7+ 不同。)也许您需要运行sample.exe 而不调用cmd 或设法退出@ 987654330@exit %errorlevel%之后(在子公司cmd上下文内)
【解决方案2】:

这应该可行:

cmd /V:ON /c sample.exe "test" > c:\ouput.log ^& echo !ERRORLEVEL! ^> c:\returnCode.log

/V:ON 开关与setlocal EnableDelayedExpansion 的效果相同。有关详细信息,请输入:cmd /?

编辑:小错误已修复,& 字符必须用^ 转义,否则,echo !ERRORLEVEL! 命令在 cmd / 中执行五:开!!!

编辑:通过^> 转义回声重定向只会使回声通过管道传输到日志中。如果您不转义,则整个命令将通过管道传输到那里,即包括来自“sample.exe”的标准输出流。

【讨论】:

  • 感谢您的回复。上面的命令正在打印“!ERRORLEVEL!”而是退出 c:\returnCode.log 中的代码值。我什至尝试使用 %ERRORLEVEL%,但它仍在打印最后执行的命令退出代码。 /V:ON /c sample.exe "test" > c:\ouput.log & echo %ERRORLEVEL% > c:\returnCode.log
  • 也许第二个> 也需要转义:^& echo !ERRORLEVEL! ^> ... 或者第一个,也许?你需要在这里做一些测试......
  • 我相信> 都需要转义。
【解决方案3】:

感谢您的回复。只有当我通过 WMI 类(Win32_Process)运行时,我才能使用以下命令获取当前执行命令的退出代码。使用 WMI 客户端,我在远程机器上执行以下命令,它工作正常,即能够在 Retrun.txt 中编写退出代码

命令: cmd /V:ON /c sample.bat "test" > c:\Output.txt & echo !ERRORLEVEL! > c:\Return.txt

但是如果我在同一台远程机器的命令提示符下运行相同的命令,它会打印“!ERRORLVEL!”在 Return.txt 而不是“sample.bat”退出代码中。

我很想知道如果我在本地从同一台机器的命令提示符运行它为什么不起作用。

【讨论】:

  • 解释在答案中。在 CMD 的命令行上指定 /V:ON 会启用延迟扩展。您尝试在其中运行命令的已经打开的 CMD 会话显然不是使用 /V:ON 开关启动的——这意味着延迟扩展未启用(并且仍然未启用)。 (至于为什么需要延迟扩展——这是因为!语法,它延迟扩展。)
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2018-06-21
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多