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