使用其他命令

时间:2015-12-11 15:27:53

标签: batch-file cmd windows-7

我有一个需要在32位上下文中运行的批处理文件,因此包含一些代码来调用具有自己路径的32位命令处理器。此脚本还需要能够通过exit /b 123在失败时返回错误代码。然而...
exit位于( )块中时,AND包含其后的任何语句,则无法正确返回。

@echo off
setlocal EnableDelayedExpansion

rem Ensure we're running in 32-bit mode
if not %PROCESSOR_ARCHITECTURE%==x86 (
  echo Thunking to 32-bit mode
  %Windir%\SysWOW64\cmd.exe /c %0
  echo !ERRORLEVEL!
  exit /b !ERRORLEVEL!
)

(
  echo before
  exit /b 456
  echo after
)

输出如下:

H:\>sub.bat
Thunking to 32-bit mode
before
0

H:\>

如果您在echo之后删除了exit,那么它的工作方式与预期一致。

H:\>sub.bat
Thunking to 32-bit mode
before
456

H:\>

即使用echo或任何其他命令替换rem,它仍然会失败。如果手动运行32位cmd.exe并运行相同的脚本,则会正确设置退出代码。

H:\>sub.bat
before

H:\>echo %ERRORLEVEL%
456

H:\>

任何人都可以为此做出解释和解决方法吗?

1 个答案:

答案 0 :(得分:5)

在脚本的“else”部分使用/ b开关会导致第二个cmd.exe实例丢失退出代码。

当从Syswow64执行批处理文件的第二个实例时,它将以456的代码退出。它的父cmd.exe将收到此退出代码,但没有兴趣保留它。 cmd.exe能够成功运行批处理,因此退出0,返回第一个实例。

如果省略脚本“​​else”部分中的/ b开关,则会强制批处理文件退出其父cmd.exe,而不是仅仅完成处理。当cmd.exe被告知退出时使用456退出代码,这将被保留。

“退出”的帮助文本确实推断了这种行为,但是在你仔细阅读它之前它似乎并不是很明显!