Файл .cmd и .bat преобразует код возврата в сообщение об ошибке - PullRequest
6 голосов
/ 25 сентября 2008

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

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

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

Например:

1 - означает сбой по той или иной причине

2 - означает сбой по какой-то другой причине

...

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

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

echo FAILED: Тестовый случай не пройден, причина ошибки: lookupError (% errorlevel%) >> TestSuite1Log.txt

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

Ответы [ 6 ]

14 голосов
/ 25 сентября 2008

Вы можете сделать это довольно аккуратно с опцией 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 в командной строке для получения дополнительной информации о отложенном расширении.

2 голосов
/ 25 сентября 2008

Вы можете сделать что-то вроде следующего кода. Обратите внимание, что сравнения уровней ошибок должны происходить в порядке убывания из-за причуды 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
1 голос
/ 25 сентября 2008

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

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

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

1 голос
/ 25 сентября 2008

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

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

0 голосов
/ 25 сентября 2008

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

См:

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

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

...