Выполните команды пакетного файла Windows .cmd асинхронно и перехватите коды возврата - PullRequest
0 голосов
/ 18 марта 2019

Я могу запускать несколько вызовов SAS по очереди, захватывая код возврата после каждого вызова, чтобы 2-й вызов и последующий запуск выполнялись только в том случае, если 1-й вызов не содержит ошибок, 3-й и последующие операции выполняются только в том случае, если 2-й вызов не содержит ошибок, ии т. д.

Вот код для 2 вызовов, который работает как нужно.(Я не спрашиваю, как вызвать SAS; то, что ниже, синтаксически правильно).

Я использую setlocal ENABLEDELAYEDEXPANSION, потому что я понимаю, что это предотвращает одновременное разрешение всех уровней ошибки.

@echo off
setlocal ENABLEDELAYEDEXPANSION
REM call 1st program
"C:\Program Files\SASHome_94\SASFoundation\9.4\sas.exe" -sysin c:\test1.sas -nosplash -nologo -nostatuswin -log 'c:\test1.log' -print 'c:\test1.txt'
if !errorlevel! neq 0 (
  set error_segment=test1.sas
  goto :errorabort
)
REM then call 2nd program if return code from 1st program was 0
"C:\Program Files\SASHome_94\SASFoundation\9.4\sas.exe" -sysin c:\test2.sas -nosplash -nologo -nostatuswin -log 'c:\test2.log' -print 'c:\test2.txt'
if !errorlevel! neq 0 (
  set error_segment=test2.sas
  goto :errorabort
)
exit /b
:errorabort
echo Error in program %error_segment% so script aborts

Я хочу выполнить оба вызова асинхронно и захватить коды возврата, чтобы третий вызов и далее выполнялся только тогда, когда оба задания без ошибок.Я пробовал несколько вещей, но ничего не работает.Вот типичный код.

@echo off
setlocal ENABLEDELAYEDEXPANSION
START "test1" "C:\Program Files\SASHome_94\SASFoundation\9.4\sas.exe" -sysin c:\test1.sas -nosplash -nologo -nostatuswin -log 'c:\test1.log' -print 'c:\test1.txt'
START "test2" "C:\Program Files\SASHome_94\SASFoundation\9.4\sas.exe" -sysin c:\test2.sas -nosplash -nologo -nostatuswin -log 'c:\test2.log' -print 'c:\test2.txt'
REM check the !errorlevel! from each invocation here, proceed if all are 0 else abort with message
echo errorlevel from asyncronous test is !errorlevel!

Я не вижу, как захватить коды возврата.Из тестирования, где я использую функцию сна в программах SAS, чтобы они выполнялись в течение нескольких минут, я вижу, что сценарий переходит к оператору ECHO, как только начинаются оба вызова, и в этот момент я получаю уровень ошибки 0.Хотя в идеале я хотел бы захватить каждый из кодов возврата, я мог бы пережить захват самого высокого кода возврата, если бы он был ненулевым.

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...