有没有一种简单的方法可以从嵌套的批处理脚本中捕获错误代码(%errorlevel%)?

时间:2015-06-18 21:48:38

标签: windows batch-file cmd

我有一个嵌套的批处理脚本,我希望我的错误代码渗透到调用它的主批处理脚本。我试过了

exit /b %errorlevel%

但变量没有回复。在调用的批处理脚本中,ECHO'%errorlevel%给了我103,但主批处理脚本中的ECHO&#39%%errorlevel%(执行方面的下一行)给了我0.这个问题已被问到在之前的SO,但没有一个帖子对我有效。

编辑:由于写作不好,我修改了我的问题,并且还会添加代码供你查看。

这是主批处理文件。除非我将条件更改为0以外的其他值,否则此处的if语句永远不会被命中:

call BuildInstaller.cmd %SourceDir% %TargetDir% %ProductVersion% %%I
if %errorlevel% neq 0 (
    ECHO %date% %time%: Build of %%I failed, halting >> %LOGFILE%
    exit /b %errorlevel%
)

这是BuildInstaller.cmd退出的地方。我已经清理了打印件以避免混淆:

if %errorlevel% neq 0 (
    exit /b %errorlevel%
)

作为旁注,我也尝试过做

set returnvalue=12

在被调用的批处理脚本中,但主批处理脚本中的ECHO"%returnvalue%始终是后面程序的一次执行。如果有人知道这个子问题的答案,那就太清楚了。

2 个答案:

答案 0 :(得分:2)

您有经典的延迟扩展错误。见这个例子:

call BuildInstaller.cmd %SourceDir% %TargetDir% %ProductVersion% %%I
if %errorlevel% neq 0 (
    ECHO %date% %time%: Build of %%I failed, halting >> %LOGFILE%
    exit /b %errorlevel%
)

这是BuildInstaller.cmd:

@echo off
setlocal EnableDelayedExpansion

if 1 == 1 (
   rem Inside a code block, %errorlevel% have the same value it had before the block
   rem (its %value% is NOT updated inside the block) so you need to use !errorlevel!
   rem in order to get the *updated* value

   verify set errorlevel = 1
   if !errorlevel! neq 0 (
      exit /b !errorlevel!
   )
)

exit /B

有关详细信息,请查看"延迟扩展"。

答案 1 :(得分:1)

在执行每个命令后设置errorlevel。因此,错误级别0是创建错误级别103之后的语句的结果。

使用多个批处理文件进行说明:

sub.bat:

 rem This is invalid argument for zip which sets errorlevel
 zip -QQ

test.bat的:

 @echo off
 call sub.bat
 echo %errorlevel%

第一行来自zip的示例输出:

zip error: Invalid command arguments (no such option: Q)
16