2008-09-24 20 views
6

Estoy intentando automatizar un programa que hice con un banco de pruebas a través de un archivo .cmd.Archivo .cmd y .bat convirtiendo el código de retorno en un mensaje de error

Puedo obtener el programa que ejecuté el código de retorno mediante% errorlevel%.

Mi programa tiene ciertos códigos de retorno para cada tipo de error.

Por ejemplo:

1 - medios fracasaron por tal o cual razón tan

2 - medios fallaron por alguna otra razón

...

echo failed: Caso de prueba falló , nivel de error:% errorlevel% >> TestSuite1Log.txt

En su lugar, me gustaría decir de alguna manera:

echo FALLIDO: caso de prueba fallido, razón del error: error de búsqueda (% errorlevel%) >> TestSuite1Log.txt

¿Es esto posible con un archivo .bat? ¿O debo pasar a un lenguaje de scripts como python/perl?

Respuesta

13

Puede hacerlo bastante bien con la opción ENABLEDELAYEDEXPANSION. Esto le permite usar ! como marcador de variable que se evalúa después de %.

REM Turn on Delayed Expansion 
SETLOCAL ENABLEDELAYEDEXPANSION 

REM Define messages as variables with the ERRORLEVEL on the end of the name 
SET MESSAGE0=Everything is fine 
SET MESSAGE1=Failed for such and such a reason 
SET MESSAGE2=Failed for some other reason 

REM Set ERRORLEVEL - or run command here 
SET ERRORLEVEL=2 

REM Print the message corresponding to the ERRORLEVEL 
ECHO !MESSAGE%ERRORLEVEL%! 

Tipo HELP SETLOCAL y HELP SET en un símbolo del sistema para obtener más información sobre expansión retardada.

+0

Me gusta la simplicidad de eso, mi respuesta se remonta a hace más tiempo días DOS. ¿Cuándo se agregó la opción ENABLEDELAYEDEXPANSION? –

+0

Oh, algo de lo que tener cuidado, el comando "setlocal" que se muestra arriba sobrescribirá el ERRORLEVEL. Asegúrese de que se llame a setlocal antes del comando que establece el nivel de error (el archivo por lotes anterior hace frente a esto). –

+0

No tengo idea de cuándo fue agregado desafortunadamente. Sé que está disponible en XP y 2003 Server, ya que he escrito scripts que se ejecutan en esas plataformas. No estoy seguro de qué versiones anteriores de Windows funciona. –

1

No exactamente así, con una subrutina, pero puede llenar una variable con el texto utilizando una solución de goto.

Puede ser más fácil si este conjunto de pruebas tuyo crece bastante para utilizar un lenguaje más potente. Perl o incluso Windows Scripting Host pueden ayudarte.

1

Sí, puede usar la llamada. Solo en una nueva línea, llame y pase el código de error. Esto debería funcionar, pero no lo he probado.

C:\Users\matt.MATTLANT>help call 
Calls one batch program from another. 

CALL [drive:][path]filename [batch-parameters] 

    batch-parameters Specifies any command-line information required by the 
        batch program. 

Sedit: orry i puede haber entendido mal un poco, pero que puede utilizar si también

1

prueba sus valores en orden inverso y utilizar el comportamiento de sobrecarga de SI:

@echo off 
myApp.exe 
if errorlevel 2 goto Do2 
if errorlevel 1 goto do1 
echo Success 
goto End 

:Do2 
echo Something when 2 returned 
goto End 

:Do1 
echo Something when 1 returned 
goto End 

:End 

Si quieres ser más poderoso, puedes intentar algo como esto (necesitarías reemplazar el% 1 con% errorlevel pero es más difícil probarlo). Usted tendría que poner una etiqueta para cada nivel de error a lidiar con:

@echo off 
echo passed %1 
goto Label%1 

:Label 
echo not matched! 
goto end 

:Label1 
echo One 
goto end 

:Label2 
echo Two 
goto end 

:end 

Aquí está una prueba:

C:\>test 
passed 
not matched! 

C:\>test 9 
passed 9 
The system cannot find the batch label specified - Label9 

C:\>test 1 
passed 1 
One 

C:\>test 2 
passed 2 
Two 
0

Usted puede utilizar el 'IF ERRORLEVEL' declaración a hacer cosas diferentes en función de la código de retorno.

Ver:

http://www.robvanderwoude.com/errorlevel.html

En respuesta a su segunda pregunta, se trasladaría a la utilización de un lenguaje de programación de todos modos, ya que los archivos por lotes de Windows son inherentemente tan limitado. Hay grandes distribuciones de Windows para Perl, Python, Ruby, etc., así que no hay razón para no usarlas, realmente. Personalmente me encanta hacer scripts Perl en Windows.

2

Puede hacer algo como el siguiente código. Tenga en cuenta que las comparaciones de nivel de error deben estar en orden decreciente debido a una peculiaridad de cmd.

setlocal 

rem Main script 
call :LookupErrorReason %errorlevel% 
echo FAILED Test case failed, error reason: %errorreason% >> TestSuite1Log.txt 
goto :EndOfScript 

rem Lookup subroutine 
:LookupErrorReason 
    if %%1 == 3 set errorreason=Some reason 
    if %%1 == 2 set errorreason=Another reason 
    if %%1 == 1 set errorreason=Third reason 
goto :EndOfScript 

:EndOfScript 
endlocal 
Cuestiones relacionadas