Estoy empezando a aprender a escribir guiones. Estoy tratando de entender cómo maneja el sistema los niveles de error y cómo se pueden usar en el manejo de errores. Sé que hay una diferencia entre la variable de entorno% ERRORLEVEL% y el nivel de error del sistema. Si entiendo esto correctamente, entonces el código If ERRORLEVEL 1
verificaría la variable de entorno antes de que verifique el nivel de error del comando anterior.Programación por lotes, manejo de errores y comando de inicio
Por lo tanto, en mi programa estoy tratando de interconectar un script de inicio/detención que iniciará/detendrá todas las secuencias de comandos de una máquina determinada (para probar simplemente estoy usando una aplicación notepad.exe como ejemplo). Tengo dos scripts de envoltura que iniciarán o detendrán las aplicaciones pasando argumentos al script independiente. Si hay un error en la secuencia de comandos independiente, establecerá el nivel de error con el comando EXIT /B n
. Una vez que se devuelve el control al script de llamada, irá a un script de manejo de errores si el estado de salida no es cero.
Al principio estaba configurando% ERRORLEVEL% en cero manualmente y luego probando un error después de un comando START o TASKKILL. Pero luego leí que borrar% ERRORLEVEL% con SET ERRORLEVEL=
es un mejor método. Mi problema viene cuando intento iniciar la aplicación con
START "" notepad.exe
Siempre que pongo a prueba el nivel de error después de este comando es siempre mayor o igual a 1 menos que utilice SET ERRORLEVEL = 0 antes de correr el comando de arranque. He insertado el código para los cuatro guiones a continuación. Cualquier idea y consejo sería muy apreciado.
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
Si está ejecutando el código, aquí es donde me aparece un error. Si utilizo start, enciende el bloc de notas sin ningún error. Si utilizo stop, detiene el bloc de notas sin ningún error. Si utilizo detener de nuevo, arroja un error como se esperaba. Ahora, si uso start, debería iniciar el bloc de notas sin ningún error nuevamente. Sin embargo, la instrucción if después del comando START es verdadera y va a un error. No estoy seguro de por qué sucede esto. ¡Por favor ayuda! – grocky