файлы .cmd и .bat, преобразующие код возврата в сообщение об ошибке
-
02-07-2019 - |
Вопрос
Я пытаюсь автоматизировать программу, которую я создал с помощью набора тестов, с помощью файла .cmd.
Я могу получить код возврата программы, которую я запустил, через %errorlevel% .
В моей программе есть определенные коды возврата для каждого типа ошибок.
Например:
1 - означает сбой по такой -то причине
2 - означает сбой по какой-то другой причине
...
эхо НЕ СРАБОТАЛО:Сбой тестового примера, уровень ошибки:% уровень ошибки% >> TestSuite1Log.txt
Вместо этого я хотел бы как-то сказать:
эхо НЕ СРАБОТАЛО:Сбой тестового примера, причина ошибки:LookupError(%уровень ошибки%) >> TestSuite1Log.txt
Возможно ли это с помощью файла .bat?Или мне нужно перейти на язык сценариев, такой как python / perl?
Решение
Вы можете сделать это довольно аккуратно с помощью 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
дополнительную информацию о отложенном расширении можно получить в командной строке.
Другие советы
Вы можете сделать что-то вроде следующего кода.Обратите внимание, что сравнения уровней ошибок должны выполняться в порядке убывания из-за особенности 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
Не совсем так, с помощью подпрограммы, но вы можете либо заполнить переменную a текстом, используя гото обходной путь.
Возможно, будет проще, если ваш набор тестов немного расширится, чтобы использовать более мощный язык.Perl или даже Windows Scripting Host могут вам в этом помочь.
Да, вы можете использовать call.Просто в новой строке вызовите call и вставьте код ошибки.Это должно сработать, но я еще не тестировал.
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.
СЕДИТ:орри, возможно, я немного неправильно понял, но вы также можете использовать 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
Вы можете использовать инструкцию 'IF ERRORLEVEL' для выполнения различных действий на основе возвращаемого кода.
Видишь:
http://www.robvanderwoude.com/errorlevel.html
В ответ на ваш второй вопрос, я бы все равно перешел на использование языка сценариев, поскольку пакетные файлы Windows по своей сути настолько ограничены.Существуют отличные дистрибутивы Windows для Perl, Python, Ruby и т.д., так что на самом деле нет причин не использовать их.Лично мне нравится создавать сценарии на Perl в Windows.