Пакетное программирование, обработка ошибок и команда запуска - PullRequest
6 голосов
/ 28 июня 2011

Я только начинаю учиться писать сценарии.Я пытаюсь понять, как система обрабатывает уровни ошибок и как их можно использовать при обработке ошибок.Я знаю, что существует разница между переменной среды% ERRORLEVEL% и уровнем ошибок системы.Если я правильно понимаю, тогда код If ERRORLEVEL 1 проверит переменную среды, прежде чем проверяет уровень ошибок предыдущей команды.

Итак, в моей программе я пытаюсь связать скрипт запуска / остановки, который запустит / остановит все скрипты данного компьютера (для тестирования я просто использую одно приложение notepad.exe в качестве примера).У меня есть два скрипта-обертки, которые либо запускают, либо останавливают приложения, передавая аргументы независимому скрипту.Если в независимом скрипте есть ошибка, он установит уровень ошибки с помощью команды EXIT /B n

.Как только управление возвращается вызывающему сценарию, оно переходит к сценарию обработки ошибок, если состояние выхода не равно нулю.

Сначала я устанавливал% ERRORLEVEL% на ноль вручную, а затем проверял на наличие ошибок после команды START или TASKKILL.Но потом я прочитал, что очистка% ERRORLEVEL% с SET ERRORLEVEL= - лучший метод.Моя проблема возникает, когда я пытаюсь запустить приложение с

START "" notepad.exe

Когда бы я ни проверял уровень ошибки после этой команды, он всегда больше или равен 1, если я не использую SET ERRORLEVEL = 0, прежде чем запустить запусккоманда.Я вставил код для четырех сценариев ниже.Любое понимание и советы будут с благодарностью.

appstart.bat:

@echo off
:: Script for application Start
set ERRORLEVEL=
:: ****
:: Additional Batch files will be executed from within this file
:: Example: 
::     Call Appbat01.bat
:: The called batch file should set ERRORLEVEL non-zero if error
:: ****

call test.bat -start
if ERRORLEVEL 1 (call error.bat) 
echo.
echo Control was returned to appstart.bat...
:: **** End Calls
goto end

:end

appstop.bat:

@echo off
:: Script for application Start
set ERRORLEVEL=
:: ****
:: Additional Batch files will be executed from within this file
:: Example: 
::     Call Appbat01.ba
:: The called batch file should set ERRORLEVEL non-zero if error
:: ****

call test.bat -stop
if ERRORLEVEL 1 (call error.bat) 
echo.
echo Control was returned to appstop.bat...
:: **** End Calls
goto end

:end

test.bat:

@echo off
if "%1"=="-start" goto :start
if "%1"=="-stop" goto :stop
goto wrongParams

:start
::****
:: Insert start up stripts here...
:: If there is an error, set ERRORLEVEL=1
::****
    set ERRORLEVEL=0
    echo.
    echo ********
    echo starting the service...
    echo.
    ::start "" "C:\Program Files\Microsoft Office\office11\winword.exe"
    start notepad.exe
    if ERRORLEVEL 1 goto error
    qprocess notepad.exe
    echo *Start.success* ERRORLEVEL is: %ERRORLEVEL%
    echo.
    goto end

:stop
::****
:: Insert stopping stripts here...
:: If there is an error, set ERRORLEVEL>1
::****
    set ERRORLEVEL=0
    echo.
    echo ********
    echo stopping the service...
    echo.
    qprocess notepad.exe 
    taskkill /f /im notepad.exe
    if ERRORLEVEL 1 goto noProcess
    goto end

:noProcess
    set ERRORLEVEL=2
    echo *noProcess* ERRORLEVEL is now: %ERRORLEVEL%
    echo.
    exit /b 2
:error
:: Errorhandler. Log application status and cause of error here. Set
:: ERRORLEVEL > 1 before returning to caller. 
    set ERRORLEVEL=1
    echo.
    echo **** Error handler inside test.bat ****
    echo.
    echo *error* ERRORLEVEL is now: %ERRORLEVEL%
    echo.
    exit /b 1

:wrongParams
:: Output an error if the wrong parameters were passed to this script.
:: Maybe try to self correct the parameter...
    set ERRORLEVEL=1
    echo.
    echo '%1' is an invalid parameter.
    echo Usage: %0 [-stop ^| -start] 
    echo *wrongParams* ERRORLEVEL is now: %ERRORLEVEL%
    echo.
    exit /b 1
:end

error.bat:

@echo off
echo **** You have reached error.bat ****
echo ERRORLEVEL inside of error.bat is: %ERRORLEVEL%
echo.
::*** Handle error...***
goto error%ERRORLEVEL%

:error2
    echo The process could not be stopped for some reason.
    goto end
:error1
    echo The process had an error in start up.
::***                ***
    goto end

:end

1 Ответ

12 голосов
/ 30 июня 2011

Никогда не устанавливайте переменную% errorlevel%. Вы правы в том, что есть разница; Уровень ошибки, полученный при выходе из процесса, является внутренним регистром, который можно прочитать с помощью синтаксиса% errorlevel%. Однако если вы создадите переменную с именем ERRORLEVEL, она замаскирует внутренний регистр, и вы потеряете доступ к кодам выхода.

Если вам нужно установить регистр уровня ошибки на определенное значение, вы можете сделать это с помощью следующей команды:

%comspec% /c exit %value%

Это вызовет процесс, который немедленно завершится с нужным кодом.

...