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

JSON не может содержать символы NUL, но он может содержать escape-последовательность \u0000 для представления символа NUL. В JavaScript это будет представлено как '\\u0000' ('\u0000' это просто строка длиной один; один символ NUL).

console.log( JSON.parse('"we\\u0000e"') === "we\0e" );

6
задан aschipfl 19 February 2019 в 18:31
поделиться

6 ответов

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

14
ответ дан 8 December 2019 в 12:24
поделиться

Можно сделать что-то как следующий код. Обратите внимание, что ошибочные сравнения уровня должны произойти в порядке убывания из-за 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
2
ответ дан 8 December 2019 в 12:24
поделиться

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

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

1
ответ дан 8 December 2019 в 12:24
поделиться

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

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

1
ответ дан 8 December 2019 в 12:24
поделиться

Протестируйте свои значения в обратном порядке и используйте перегруженное поведение ЕСЛИ:

@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
ответ дан 8 December 2019 в 12:24
поделиться

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

См.:

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

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

0
ответ дан 8 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: