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

时间:2011-02-01 15:46:48

标签: batch-file cmd

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

我正在使用这样的东西:

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

但这不起作用。我尝试使用exit / b,但看起来和我一样。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

出现every now and then,IMHO出口和出口/ b被破坏,因为它们只设置了批处理文件使用的错误级别,但它们没有设置cmd.exe进程的退出代码。

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

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)或您的脚本是从程序而不是另一个批处理文件启动的,您实际上想要设置进程退出代码(在父进程中使用GetExitCodeProcess检索)

@echo off
call thiswillfail.exe 2>nul
if errorlevel 1 goto diewitherror
...
REM This code HAS to be at the end of the batch file
REM The next command just makes sure errorlevel is 0
verify>nul
:diewitherror
@%COMSPEC% /C exit %errorlevel% >nul

使用“普通”exit /b然后使用call myscript.cmd&&someotherapp.exe调用它确实有效,但您无法假设执行批处理文件的每个程序都会将该过程创建为cmd.exe /c call yourscript.cmd

答案 1 :(得分:1)

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

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

call <script.cmd>

而不仅仅是

<script.cmd>

答案 2 :(得分:1)

您可以(ab)使用GOTO's bug when it is with non existent label and negative conditional execution。在这种情况下,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%
)