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%
阅读 6.2k
2 个回答
新手上路,请多包涵

用延迟变量或者call

因为你在运行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.
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进