У меня есть консольное приложение. Взаимодействие с этим приложением осуществляется через TCP/IP.Получение кода выхода приложения началось с команд «cmd» и «start»
У меня также есть тестовая среда для него, которая в основном представляет собой набор скриптов BATCH (... не моя ошибка). Что такое тестовая структура для каждого теста, в основном это:
start /min "myapplication.exe"
и дождаться получения подтверждения о том, что приложение запущено.- отправлять команды через TCP/IP в это приложение, получать его ответы и проверять, соответствуют ли тайминги и значения тем, что ожидается в результате конкретного теста.
Одна из проблем, с которыми я сталкиваюсь сейчас, заключается в том, что приложение выходит из-за некоторой внутренней ошибки. Я хотел бы различать неудавшиеся тесты и сбой приложения. Единственное, что я имею для этого, - это код выхода приложения.
Итак, я попытался следующие:
start /min cmd /c "myapplication.exe || echo %errorLevel% > exitcode.txt"
, а затем позже в тестовых сценариях,
if exist exitcode.txt (
set /p exitcode=<exitcode.txt
echo ERROR: myapplication.exe returned exitcode %exitcode%.
goto error
) else (
goto do_processing
)
, но по какой-то странной причине, никогда не появляется текстовый файл, даже если Иногда я получаю диалог о сбое приложения, и хотя я принудительно делаю его неудачным с известным кодом нулевого выхода. Тест проходит через do_processing
и (конечно) приводит к сбою.
EDIT Когда я бегу
start /min cmd /c "nonsense || echo %errorLevel% > test.txt"
Я иногда получить текстовый файл, содержащий строку 9009, но в других случаях, что текстовый файл содержит строку 0
, или иногда 1
, .. .Что за...?!
EDIT2 Если вы наберете
cmd /k "nonsense || echo %errorLevel%"
(обратите внимание на опцию /k
), вы видите 0
печатаемые в новом окне, но если вы затем введите echo %errorlevel%
, вы получите 1
...
Я знал, что партия была не очень здравомыслящей, но она должна быть хотя бы постоянно безумная ...
Любые идеи о том, что может происходить здесь?
Вам нужно будет использовать параметр/wait, чтобы получить код выхода. Во-первых, это должно привести к тому, что вы начнете использовать старт. Избегайте пожара и забывания, когда требуется проверка ошибок. –
@Hans Passant: Я думаю, что это не сработает, потому что если вы используете 'start', код выхода не будет передан вызывающему скрипту. Вместо этого вы должны использовать 'call'. Он ведет себя как 'start/wait', но передает переменные. Проверьте это: http://stackoverflow.com/questions/13257571/call-command-vs-start-with-wait-option – MichaelS
@HansPassant: но 'start/wait' означает, что выполнение скрипта будет заблокировано. Затем скрипт не может загореться командами ... –