2008-09-24 4 views
6

Я пытаюсь автоматизировать программу, которую я создал с помощью тестового набора через .cmd-файл..cmd и .bat преобразование кода возврата в сообщение об ошибке

Я могу получить программу, в которой я выполнил код возврата через% errorlevel%.

У моей программы есть определенные коды возврата для каждого типа ошибок.

Например:

1 - средства не удалось по такой и такой причине

2 - средства не удалось по какой-то другой причине

...

эхо FAILED: случай испытания не удалось , уровень ошибки:% errorlevel% >> TestSuite1Log.txt

Вместо этого я хотел бы как-то сказать:

эха FAILED: случай испытания не удался, причина ошибки: LookupError (% ERRORLEVEL%) >> TestSuite1Log.txt

Возможно ли это с .bat файлом? Или мне нужно перейти на язык сценариев, например python/perl?

ответ

13

Вы можете сделать это довольно аккуратно с опцией ENABLEDELAYEDEXPANSION. Это позволяет использовать ! как переменный маркер, который оценивается после %.

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

Тип HELP SETLOCAL и HELP SET в командной строке для получения дополнительной информации о задержанном расширении.

+0

Мне нравится простота этого, мой ответ возвращается к более длинным дням DOS. Когда была добавлена ​​опция ENABLEDELAYEDEXPANSION? – 2008-09-24 22:32:31

1

Не совсем так, с подпрограммой, но вы можете либо заполнить переменную текстом, используя обходное решение goto.

Возможно, вам будет проще, если этот набор тестов немного подойдет для использования более мощного языка. Perl или даже Windows Scripting Host могут вам помочь.

1

Да, вы можете использовать звонок. Просто на новой строке есть вызов, а pas - код ошибки. Это должно работать, но я не тестировал.

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: иться я, возможно, не поняли немного, но вы можете использовать IF также

1

Теста свои значения в обратном порядке и использовать перегруженный поведение 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 

Если вы хотите быть более мощным, вы можете попробовать что-то вроде этого (вам нужно будет заменить% 1 на% errorlevel, но для меня сложнее проверить). Вы должны были бы поставить метку для каждого уровня ошибок вы имеете дело с:

@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 

Вот тест:

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

Вы можете использовать «IF ERRORLEVEL» заявление делать разные вещи, основанные на код возврата.

См:

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

В ответ на ваш второй вопрос, я хотел бы перейти к использованию языка сценариев в любом случае, так как пакетные файлы Windows, по своей природе настолько ограничены. Существуют отличные дистрибутивы Windows для Perl, Python, Ruby и т. Д., Поэтому нет причин не использовать их. Мне лично нравится писать сценарии на Perl в Windows.

2

Вы можете сделать что-то вроде следующего кода. Обратите внимание, что сравнение уровней ошибок должно быть в порядке убывания из-за cmd quirk.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^