加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

批处理文件 – 当使用其他命令在块内时,exit / b无法正常工作

发布时间:2020-12-14 04:25:41 所属栏目:Windows 来源:网络整理
导读:我有一个需要在32位上下文中运行的批处理文件,因此包含一些代码来调用具有自己路径的32位命令处理器.此脚本还需要能够通过exit / b 123返回失败时返回的错误代码.但是…… 当退出位于()块中时,AND包含其后的任何语句,则无法正确返回. @echo offsetlocal Enab
我有一个需要在32位上下文中运行的批处理文件,因此包含一些代码来调用具有自己路径的32位命令处理器.此脚本还需要能够通过exit / b 123返回失败时返回的错误代码.但是……
当退出位于()块中时,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%SysWOW64cmd.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:&;

如果在退出后删除回显,则它完全按预期工作.

H:&;sub.bat
Thunking to 32-bit mode
before
456

H:&;

即使用rem或任何其他命令替换echo,它仍然会失败.如果手动运行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退出代码,这将被保留.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读