【问题标题】:SAS program in Task Scheduler does not execute a subprocess using %sysexec任务计划程序中的 SAS 程序不使用 %sysexec 执行子进程
【发布时间】:2022-12-01 08:42:52
【问题描述】:

我的任务计划程序调用启动 SAS 程序的 Powershell 脚本,该程序又使用 %sysexec 执行 Windows 命令(并同时执行许多其他操作)。

当我以交互方式运行 Powershell 脚本或在任务计划程序中手动启动它时,%sysexec 命令在 SAS 程序中正确执行。

如果任务计划程序未以交互方式启动 Powershell 脚本,并且我未登录计算机,则不会执行 %sysexec 命令。然而,它返回 sysrc=0 作为结果(成功)。

在装有 Windows Server 2012 的旧机器上它可以工作,在装有 Windows 2019 的新机器上它没有。

我在这里写了一个高度简化的例子。

任务计划程序操作:

powershell -executionpolicy bypass "C:\temp\test_sas.ps1"

Powershell 脚本 test_sas.ps1:

$sasrootdirStr = "D:\sas\SASHome\SASFoundation\9.4"
$pgmdirStr = "C:\temp"
$pgmnameStr= "test_sas"
$logdirStr = "C:\temp"
$logfileStr = $logdirStr + "\" + $pgmnameStr + ".log"
& "$sasrootdirStr\sas.exe" "$pgmdirStr\$pgmnameStr.sas" -log "$logfileStr"

SAS程序test_sas.sas:

%macro test_sas;
   %local macroname;
   %let macroname= test_sas;
   %let newdir = %str(C:\temp\martin);
   %let sysrc = -1;
   %sysexec "mkdir" &newdir..; 
   %if &sysrc ne 0 %then %do;
      %put ERROR: &macroname: Could not execute command mkdir (sysrc: &sysrc.).;
   %end;
   %put sysrc: &sysrc;
%mend test_sas;
%test_sas;

日志文件 test_sas.log 中的结果(未执行 %sysexec 命令 mkdir):

sysrc: 0
NOTE: SAS Institute Inc, SAS Campus Drive, Cary, NC USA 27513-2414
NOTE: The SAS System used:
      real time 0.60 seconds
      cpu time 0.68 seconds

使用的软件版本:

新的(有错误):

  • SAS 9.04.01M7P080520
  • Windows Server 2019 标准版 1809
  • Powershell 5.1.17763.2931

旧的(没有错误):

  • SAS 9.04.01M4P110916
  • Windows Server 2012 R2 标准版
  • Powershell 4.0

怎么了?

【问题讨论】:

  • mkdir 不是可执行文件。试试%sysexec cmd /c mkdir &newdir;
  • 在实际脚本中(此处未简化),子进程是什么,如果它不是 SAS 特定的,为什么使用 SAS 而不是 PowerShell 本身?
  • 您是否尝试使用 PIPE 而不是 %SYSEXEC,以便您的 SAS 代码可以检索操作系统为响应您尝试运行命令而输出的任何消息? data _null_; infile "mkdir ""&newdir""" pipe; input; put _infile_; run;
  • 看起来您可能也降级了 SAS 版本?您的旧服务器显示 9.4M7,而您的新服务器显示 9.4M4。我不知道这是否是原因,但这可能是一个因素。
  • 对不起,我的错。 SAS 旧版本为 9.04.01M4,新版本为 9.04.01M7。

标签: windows powershell sas windows-task-scheduler


【解决方案1】:
data _null_; infile "mkdir ""&newdir""" pipe; input; put _infile_; run;

作品。但是datastep的result code始终为零(syserr=0,success),即使windows命令无法成功执行。

如何从管道中执行的命令中获取有用的返回值?我真的需要这个。

【讨论】:

    【解决方案2】:

    powershell 脚本的以下代码有效。 我可以使用 start-process comandlet,而不是使用调用运算符 (&)。子 SAS 程序中的 %sysexec 命令将在所有情况下正确执行,即使它是在任务调度程序操作中触发的。

    Powershell 脚本 test_sas.ps1:

    $process = (Start-Process -FilePath "$sasrootdirStrsas.exe" -ArgumentList "`"$pgmdirStr$pgmnameStr.sas`" -log `"$logfileStr`"" -PassThru -Wait)
    Write-Host "Process terminated with return code: " $process.ExitCode
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-19
      • 2010-12-29
      • 2012-12-28
      • 1970-01-01
      • 2018-12-01
      • 2020-12-19
      • 2017-08-22
      • 1970-01-01
      相关资源
      最近更新 更多