Windows 批处理(Batch)脚本 for 循环中无法正确获取到命令的返回值。

发布于 2022-09-05 03:47:00 字数 568 浏览 30 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ぶ宁プ宁ぶ 2022-09-12 03:47:00

用延迟变量或者call

莫言歌 2022-09-12 03:47:00

因为你在运行cmd /c exit %%a时,是打开了一个新的cmd命令行运行,它的运行结果,属于另一个进程,不会返回到当前进程中,所以在当前进程中输出%errorlevel%就是0。

Update

经测试,%ERRORLEVEL%为0的原因是,exit没有在正确的cmd.exe中返回,运行下面的代码,就可以正确使`%ERRORLEVEL%为1和2

@ECHO ON
ECHO ==============
FOR %%a IN (1, 2) DO (
   CMD /C EXIT /B %%a
   ECHO errorlevel=%ERRORLEVEL%
)
PAUSE.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文