Пакетное программирование, обработка ошибок и команда "Пуск"

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

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

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

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

START "" notepad.exe

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

appstart.летучая мышь:

@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.летучая мышь:

@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

1 ответов


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

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

%comspec% /c exit %value%

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