Pergunta

Eu estou tentando automatizar um programa que fiz com um conjunto de testes através de um arquivo .cmd.

posso obter o programa que eu corri de código de retorno via% errorlevel%.

Meu programa tem certos códigos de retorno para cada tipo de erro.

Por exemplo:

1 - meios falhou por tal e tal razão

2 - meios falharam por alguma outra razão

...

echo FAILED: caso de teste falhou, o nível de erro:% errorlevel% >> TestSuite1Log.txt

Em vez disso eu gostaria de dizer alguma forma:

echo FAILED: caso de teste falhou, razão de erro: lookupError (% errorlevel%) >> TestSuite1Log.txt

Isso é possível com um arquivo .bat? Ou eu tenho que mudar para uma linguagem de script como Python / Perl?

Foi útil?

Solução

Você pode fazer isso muito nitidamente com a opção ENABLEDELAYEDEXPANSION. Isso permite que você use ! como marcador variável que é avaliada após %.

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 e HELP SET em um prompt de comando para obter mais informações sobre a expansão atrasada.

Outras dicas

Você pode fazer algo parecido com o seguinte código. Note-se que as comparações de níveis de erro devem estar em ordem decrescente devido a uma cmd peculiaridade.

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

Não é exatamente assim, com uma sub-rotina, mas você pode preencher a uma variável com o texto usando um Ir à solução alternativa.

Pode ser mais fácil se este conjunto de testes de vocês cresce um pouco para usar uma linguagem mais poderosa. Perl ou mesmo Windows Scripting Host pode ajudá-lo lá.

Sim, você pode usar a chamada. Apenas em uma nova linha tem chamada, e PAS da errorcode. Isso deve funcionar, mas eu não testei.

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 podem ter entendido mal um pouco, mas você pode usar se também

Test seus valores na ordem inversa e usar o comportamento sobrecarregado de 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 você quiser ser mais poderoso, você pode tentar algo como isto (você precisaria para substituir o% 1 com% errorlevel mas é mais difícil de teste para mim). Você precisaria colocar um rótulo para cada nível de erro que você lidar com:

@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

Aqui está um teste:

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

Você pode usar a declaração 'IF ERRORLEVEL' para fazer coisas diferentes com base no código de retorno.

Veja:

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

Em resposta à sua segunda pergunta, gostaria de passar a usar uma linguagem de script de qualquer maneira, já que arquivos de lote de janelas são inerentemente tão limitado. Há grandes distribuições do Windows para Perl, Python, Ruby, etc., então nenhuma razão para não usá-los, realmente. Eu, pessoalmente, adoro fazer Perl scripting no Windows.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top