2011-06-27 11 views
6

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 
+0

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

Respuesta

12

Nunca debe establecer la variable% errorlevel%. Tienes razón de que hay una diferencia; El nivel de error que obtiene de un proceso de salida es un registro interno que puede leer con la sintaxis% errorlevel%. Sin embargo, si crea una variable llamada ERRORLEVEL, enmascarará el registro interno y perderá el acceso a los códigos de salida.

Si es necesario configurar el registro de nivel de error a un valor específico, puede hacerlo con el siguiente comando:

%comspec% /c exit %value% 

Esto genera un proceso que sale inmediatamente con el código deseado.

+0

¡Fantástico! Pude ejecutar los scripts sin ningún error inesperado.Intenté no configurar el ERRORLEVEL directamente antes, pero no pude restablecerlo antes de ejecutar el siguiente comando. Pero ahora configuré el ERRORLEVEL en cero usando el comando que me diste en el script error.bat después de que termine de manejar el error. – grocky

Cuestiones relacionadas