Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 为什么cmd.exe在64位机器上具有不同的errorlevel行为?_Batch File_Cmd_Errorlevel - Fatal编程技术网

Batch file 为什么cmd.exe在64位机器上具有不同的errorlevel行为?

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 >

如果我制作一个名为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应该被视为传统支持。如果您发现其行为令人困惑,是时候切换了去权力地狱。