我有一个嵌套的批处理脚本,我希望我的错误代码渗透到调用它的主批处理脚本。我试过了
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%始终是后面程序的一次执行。如果有人知道这个子问题的答案,那就太清楚了。
答案 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