Windows 批处理(Batch)脚本 for 循环中无法正确获取到命令的返回值。
Windows batch 代码
@echo on
echo ==============
for %%a in (1,2) do (
cmd /c exit %%a
echo errorlevel=%errorlevel%
)
运行结果:
errorlevel=0
errorlevel=0
以上这段代码运行结果让我非常疑惑。为啥只跟 for 循环体外的命令结果有关,仿佛 for 运行那一刻其循环体内的代码中的变量值就已经固定下了。但如果把 for 看成一个命令行程序的话,输入的变量参数在运行 for 之前就固定下了,就像其他命令行程序一样,倒也说得通。
补充说明
cmd /c exit 1
这行代码只是用来替代实际环境中用的命令行程序,以一个更直观的方式返回 exit code ,更容易看到问题所在,也可以换成其它的命令行程序。
可以进入 cmd 交互式模式输入以下两行以验证效果:
cmd /c exit 1
echo %errorlevel%
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
用延迟变量或者call
因为你在运行
cmd /c exit %%a
时,是打开了一个新的cmd
命令行运行,它的运行结果,属于另一个进程,不会返回到当前进程中,所以在当前进程中输出%errorlevel%
就是0。Update
经测试,
%ERRORLEVEL%
为0的原因是,exit
没有在正确的cmd.exe
中返回,运行下面的代码,就可以正确使`%ERRORLEVEL%为1和2