异步运行Windows .cmd批处理文件命令并捕获返回码

时间:2019-03-18 20:06:32

标签: cmd

我可以依次运行多个SAS调用,并在每次调用后捕获返回代码,以便仅在第一个调用无错误的情况下才运行第二个及以后的调用,仅在第二个无错误时才运行第三个及其后的调用,以及等等。

这是两个调用的代码,它们可以按需工作。 (我不是在问如何调用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。虽然我理想地希望捕获每个返回码,但如果有任何非零的值,我可以捕获最高的返回码。

有什么想法吗?

0 个答案:

没有答案