Batch file 如何同时退出cmd文件和shell?

Batch file 如何同时退出cmd文件和shell?,batch-file,cmd,Batch File,Cmd,我正在shell(c:\windows\system32\cmd.exe)中执行脚本(.cmd)。我想要的是,当命令返回错误代码时,.cmd文件结束执行,然后cmd.exe也结束执行,将错误代码返回给调用它的人 我用的是这样的东西: C:\...\gacutil.exe /i C:\...\x.dll if not errorlevel 0 ( echo Error registering C:\...\x.dll exit %errorlevel% ) 但这是行不通的。我尝试

我正在shell(c:\windows\system32\cmd.exe)中执行脚本(.cmd)。我想要的是,当命令返回错误代码时,.cmd文件结束执行,然后cmd.exe也结束执行,将错误代码返回给调用它的人

我用的是这样的东西:

C:\...\gacutil.exe /i C:\...\x.dll
if not errorlevel 0 (
    echo Error registering C:\...\x.dll
    exit %errorlevel%
)

但这是行不通的。我尝试了退出/b,但在我看来是一样的。有什么想法吗?

都是关于实际运行脚本的shell。当脚本执行时,它在子shell中运行,因此调用exit只会退出该子shell。但是,我认为如果使用call语句执行脚本,它将在该shell的上下文中执行,而不是执行子shell

因此,要执行脚本,请使用

call <script.cmd>
呼叫
不仅仅是

<script.cmd>

此时,IMHO exit和exit/b被破坏,因为它们只设置批处理文件使用的错误级别,但不设置cmd.exe进程的退出代码

如果批处理脚本正在执行errorlevel检查,则调用就足够了:

REM DoSomeAction.cmd
@echo off
call someprogram.exe
if errorlevel 1 exit /b 

REM MainScript.cmd
@echo off
...
call DoSomeAction.cmd
if errorlevel 1 (
  ...
)
但是,如果您想使用&&或| |语法(
myscript.cmd&&someotherapp.exe
),或者脚本是从程序而不是另一个批处理文件启动的,那么您实际上需要设置进程退出代码(在父进程中使用)

使用“正常”
exit/b
,然后使用调用myscript.cmd和&someotherapp.exe调用它确实有效,但您不能假设每个执行批处理文件的程序都会创建一个进程,因为
cmd.exe/c call yourscript.cmd
您可以(ab)使用
GOTO的
。在这种情况下,
cmd.exe
将从批处理脚本模式切换到命令提示模式,并且可以退出:

C:\...\gacutil.exe /i C:\...\x.dll
if not errorlevel 0 (
    echo Error registering C:\...\x.dll
    goto :no_such_label >nul 2>&1 || exit %errorlevel%
)

您的意思是使用在同一会话中运行的批处理脚本退出shell的交互式会话吗?Rigth,我正在从远程位置运行该会话,我想从批处理结束该会话,以使会话返回出错命令中的errorlevel。我明白了。关于返回errorlevel的最后一部分有些复杂。我正在考虑某种终止会话的方法,不过首先需要找出它的PID。无论如何,似乎你需要一些不同的东西,这样你也可以返回结果…而且你不可能以非交互方式运行脚本,是吗?是的,整个过程都是无人参与的,所以我可以在没有用户交互的情况下运行脚本。为什么?谢谢。我是callnig cmd.exe/c myscript.cmd,没有在cmd中使用call。非常感谢,安德斯就是这么说的。谢谢
C:\...\gacutil.exe /i C:\...\x.dll
if not errorlevel 0 (
    echo Error registering C:\...\x.dll
    goto :no_such_label >nul 2>&1 || exit %errorlevel%
)