Batch file 为什么cmd.exe在64位机器上具有不同的errorlevel行为?
如果我制作一个名为temp.bat的批处理脚本(例如),其中包含:Batch file 为什么cmd.exe在64位机器上具有不同的errorlevel行为?,batch-file,cmd,errorlevel,Batch File,Cmd,Errorlevel,如果我制作一个名为temp.bat的批处理脚本(例如),其中包含: exit /b 1 当我以各种方式运行它时,我在我的32位XP系统和64位XP系统上得到了不同的行为 在32位上: > temp.bat > echo %ERRORLEVEL% 1 > cmd /c temp.bat > echo %ERRORLEVEL% 0 在64位上: > temp.bat > echo %ERRORLEVEL% 1 > cmd /c temp.bat >
exit /b 1
当我以各种方式运行它时,我在我的32位XP系统和64位XP系统上得到了不同的行为
在32位上:
> temp.bat
> echo %ERRORLEVEL%
1
> cmd /c temp.bat
> echo %ERRORLEVEL%
0
在64位上:
> temp.bat
> echo %ERRORLEVEL%
1
> cmd /c temp.bat
> echo %ERRORLEVEL%
1
我已经搜索了cmd.exe选项,但找不到任何控制它如何从批处理脚本传播errorlevel信息的选项。目前,我无法找到任何合理的解释来解释这种差异。您必须小心退出/b,因为它并不是在所有情况下都能正常工作。例如:
temp.bat&echo 0|echo 1
如果temp.bat包含exit/b1,则您希望打印1,但实际并非如此。遗憾的是,真正为批处理文件设置有效退出代码的唯一方法是使用
@%COMSPEC%/C exit 1
作为批处理文件中的最后一行Anders示例的问题是它使用了.bat文件。如果使用.cmd文件,exit将按文档所述工作
同时拥有.bat和.cmd文件的要点似乎是向后兼容:如果它正在执行.bat文件,cmd会尝试模拟NT之前的CLI command.com,后者的错误处理要简单得多
至少这是我的猜测。我在谷歌搜索.bat/.cmd上的官方文档时偶然发现了这条线索,但我似乎找不到它。我猜:32位版本保持原来的行为是因为向后兼容。64位版本没有这个要求,所以对自动脚本的行为更加友好。啊哈!雷蒙德的女儿[对雷蒙德的伴娘][无法在此处复制。在32位和64位上都适用。Anon:批处理文件无法指示它们是要在64位系统上运行32位还是64位。您的观点基本上是错误的。在64位系统上不再适用的是16位可执行文件;32位仍然可以正常工作。非常好,我尝试了您的建议,并且成功了在这两台机器上的工作原理相同。至少在Windows 10上,.bat/.cmd对此没有区别。Anders的命令在这两种情况下都打印
0
。这只会使整个.bat/.cmd事情更加神秘和令人沮丧。不管怎样:cmd.exe应该被视为传统支持。如果您发现其行为令人困惑,是时候切换了去权力地狱。