尝试为旧程序自动化一些 DOSBox 脚本,我想使用通常的退出代码errorlevel
来控制程序流。
输入在hello_db.bat
文件中给出:
@echo off
set msg=Hello
echo %msg%
dir
echo errorlevel = %errorlevel%
然后 DOSBox 被调用dosbox hello_db.bat
。
输出是:
Hello
{Listing from dir}
errorlevel =
因此%errorlevel%
扩展为空字符串而不是命令的退出代码dir
,其中第一个msg
变量可以正确扩展。
如何使 DOSBoxerrorlevel
在脚本中正确展开?
基于@phuclv 通过回答的简短回答:
如果不正常(错误级别!= 0),要求是在命令后插入暂停,所以最终做了:
set errorany=0
:: Command is inserted here...
if errorlevel 1 set errorany=1
:: Make pause if not OK
if %errorany%==1 pause
因为
%ERRORLEVEL%
在 MS-DOS 中不是变量。它是 DR-DOS 和特定于 cmd 的。它们是非常不同的东西像
%DATE%
或许多其他变量一样,它们是 cmd.exe 的新功能,需要启用命令扩展如果您关闭命令扩展以实现 DOS 兼容性,您将无法访问 Windows cmd.exe 上的这些变量
如果您必须坚持使用 MS-DOS 及其 command.com,那么获得错误级别的唯一方法就是
if errorlevel
按降序使用幸运的是,如果您真的必须处理所有 255 个错误代码,那么您实际上不必编写 255 行代码。但它仍然相当长,如果您有兴趣,请参阅下面的 [ § ]
如果您可以安装替代 shell(通过
SHELL=\path\to\shell.com
在 config.sys 中设置),那么会有一些带有错误级别变量的3 rd方 shell。例如著名的 4DOS 有%_?
§如何检查每个可能的错误级别:
信用:https ://www.robvanderwoude.com/errorlevel.php
正如@phuclv 所说,您不应该尝试使用
%ERRORLEVEL%
,因为它比 DOS 更新。相反,请使用较旧的IF ERRORLEVEL n
构造,它测试错误级别是否为n 或更高。这意味着您应该按降序测试可能的错误级别:您应该阅读 SS64 的Errorlevel上的 Detecting Errorlevel 部分,特别注意它讨论与 DOS 兼容性的开头。