当前位置:  开发笔记 > 编程语言 > 正文

使用其他命令在块内部时,exit/b无法正常工作

如何解决《使用其他命令在块内部时,exit/b无法正常工作》经验,为你挑选了1个好方法。

我有一个需要在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:\>

如果你删除echoexit,它完全按预期工作.

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

H:\>

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

H:\>sub.bat
before

H:\>echo %ERRORLEVEL%
456

H:\>

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



1> 小智..:

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

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

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

"退出"的帮助文本确实推断了这种行为,但是在你阅读它之前看起来并不是很明显!


优秀的解释!+1(这是你在这个论坛的第一个答案)欢迎!**`:)`**
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有