Domanda

Sto cercando di automatizzare un programma creato con una suite di test tramite un file .cmd.

Posso ottenere il programma che ho eseguito il codice di ritorno tramite% errorlevel%.

Il mio programma ha determinati codici di ritorno per ogni tipo di errore.

Ad esempio:

1 - significa non riuscito per tale e per tale motivo

2 - significa non riuscito per qualche altro motivo

...

echo FAILED: caso di test fallito, livello di errore:% errorlevel% > > TestSuite1Log.txt

Invece vorrei in qualche modo dire:

echo FAILED: caso di test fallito, motivo dell'errore: lookupError (% errorlevel%) > > TestSuite1Log.txt

È possibile con un file .bat? O devo passare a un linguaggio di scripting come python / perl?

È stato utile?

Soluzione

Puoi farlo abbastanza bene con l'opzione ENABLEDELAYEDEXPANSION . Questo ti permette di usare ! come marker variabile che viene valutato dopo % .

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%!

Digitare HELP SETLOCAL e HELP SET al prompt dei comandi per ulteriori informazioni sull'espansione ritardata.

Altri suggerimenti

Puoi fare qualcosa come il seguente codice. Si noti che i confronti a livello di errore dovrebbero essere in ordine decrescente a causa di una stranezza 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

Non esattamente così, con una subroutine, ma puoi popolare la variabile a con il testo usando goto soluzione alternativa.

Potrebbe essere più semplice se questa tua suite di test cresce un po 'per usare un linguaggio più potente. Perl o anche Windows Scripting Host possono aiutarti lì.

Sì, puoi usare la chiamata. Solo su una nuova linea chiama e passa il codice di errore. Dovrebbe funzionare, ma non l'ho testato.

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 potrei aver frainteso un po ', ma puoi usare anche IF

Testa i tuoi valori in ordine inverso e usa il comportamento sovraccarico di IF :

@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

Se vuoi essere più potente, potresti provare qualcosa del genere (dovresti sostituire% 1 con% errorlevel ma è più difficile testarlo per me). Dovresti mettere un'etichetta per ogni livello di errore che gestisci:

@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

Ecco un test:

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

Puoi usare l'istruzione 'IF ERRORLEVEL' per fare cose diverse in base al codice di ritorno.

See:

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

In risposta alla tua seconda domanda, passerei comunque all'uso di un linguaggio di scripting, poiché i file batch di Windows sono intrinsecamente così limitati. Ci sono ottime distribuzioni di Windows per Perl, Python, Ruby, ecc., Quindi nessun motivo per non usarle, davvero. Personalmente adoro fare script Perl su Windows.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top