gpt4 book ai didi

batch-file - exit/b 在包含其他命令的 block 中时无法正常工作

转载 作者:行者123 更新时间:2023-12-04 00:08:21 25 4
gpt4 key购买 nike

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

@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:\>

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

最佳答案

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

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

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

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

关于batch-file - exit/b 在包含其他命令的 block 中时无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34226971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com