【发布时间】: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: ¯oname: 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