Как выйти из cmd файла и оболочки одновременно? - PullRequest
2 голосов
/ 01 февраля 2011

Я выполняю скрипт (.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%
)

Но это не работает.Я попытался с выходом / b, но выглядит так же для меня.Есть идеи?

Ответы [ 3 ]

5 голосов
/ 02 февраля 2011

Время от времени время от времени , выход 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

Использование «обычного» * ​​1014 * с последующим вызовом его с помощью call myscript.cmd&&someotherapp.exe работает, но вы не можете предполагать, что каждая программа, выполняющая пакетный файл, создаст процесс как cmd.exe /c call yourscript.cmd

1 голос
/ 25 июня 2014

Вы можете (ab) использовать ошибку GOTO's , когда она существует с несуществующей меткой и отрицательным условным выполнением . В этом случае 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%
)
1 голос
/ 01 февраля 2011

Все дело в оболочке, которая на самом деле запускает скрипт.Когда сценарий выполняется, он запускается в подоболочке, поэтому вызов exit просто завершает эту подоболочку.Тем не менее, я думаю, что если вы выполните скрипт, используя оператор вызова, он будет выполняться в контексте этой оболочки, а не выполнить подоболочку.

Итак, для выполнения скрипта используйте

call <script.cmd>

, а не просто

<script.cmd>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...