файлы .cmd и .bat, преобразующие код возврата в сообщение об ошибке

StackOverflow https://stackoverflow.com/questions/130273

Вопрос

Я пытаюсь автоматизировать программу, которую я создал с помощью набора тестов, с помощью файла .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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top