SAS代码无法扫描来自VBA的Bat文件中的参数

时间:2016-01-28 08:52:52

标签: vba excel-vba batch-file sas batch-processing

我正在尝试使用bat文件(批量运行)从我的VBA代码运行我的SAS代码。所以系统应该这样工作:第一个VBA代码向bat文件发送一些参数,然后bat文件将这些参数发送到我的SAS代码中。然后bat文件执行我的SAS代码。

但是,显然Bat文件无法将参数发送到我的SAS代码中,根据SAS系统它们不存在。当我运行我的VBA代码(也运行Bat文件)时,我收到一条错误消息,如

  

此窗口在行模式下不可用。

VBA代码是这样的:

Public Sub RunSASCodeViaBatFile()
    ...
    Parameter settings here 
    ...

    Dim cmdString As String: cmdString = batPath & batFile & " " & SASFilePath & " " & SASFile & " " & SASOutputPath & " " & YearMonth
    Dim wsh As Object
    Set wsh = VBA.CreateObject("WScript.Shell")
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 2
    wsh.Run cmdString, windowStyle, waitOnReturn
End Sub

批处理文件中的命令如下所示:

Some General SAS settings in bat file like:
set sas="C:\Program Files\SAS\SASFoundation\9.2(32-bit)\sas.exe" -autoexec
....

Settings for the input parameters
set SASFilePath=%1
set SASFile=%2
set SASOutputPath=%3
set YearMonth=%4

if %debug%==1 (
   echo %thisscript%: Debug: Execute SAS program
   echo %thisscript%: Debug: sas=%sas%
)   
%sas% -sysin "%sasfilepath%\%sasfile%" -SYSPARM "%SASFilePath%#%SASFile%#%SASOutputPath%#%YearMonth%" -log "%SASOutputPath%\log\%SASFile%_%date_time%.log" -nosplash -icon -no$syntaxcheck -rsasuser -noprint
if %debug%==1 echo %thisscript%: Debug: errorlevel=%errorlevel%
if %errorlevel% neq 0 (
  echo %thisscript%: Error: Execution of SAS program returned code %errorlevel%
  exit /b %errorlevel%
)

最后,SAS代码扫描(读入)批处理参数,如下所示。我试图用SYSPARM命令读取批处理参数:

    %LET sasfilepath = %SCAN(&SYSPARM, 1, '#');
    %LET sasfile = %SCAN(&SYSPARM, 2, '#');
    %LET sasoutputpath = %SCAN(&SYSPARM, 3, '#');
    %LET perdate = %SCAN(&SYSPARM, 4, '#');

我认为当SAS代码尝试扫描参数batPathbatfileSASFilePathSASFileSASOutputPath,{{1 }}。因为批处理文件可以正确使用这些参数来创建日志名称或查找具有这些参数的路径。

所以任何人都知道为什么我的SAS无法扫描蝙蝠参数?

1 个答案:

答案 0 :(得分:1)

从此注释看起来,您的批处理SAS作业正在尝试执行需要交互式会话的操作,例如使用DM命令。 http://support.sas.com/kb/44/705.html

您展示的%let语句不应导致此问题。我会在SAS代码中寻找其他地方。

实际上我首先要删除SAS调用中的-icon选项。该选项可能期望与窗口的交互式会话最小化。

如果您之后在SAS代码中没有看到嫌疑人,请尝试暴力调试。注释掉所有SAS代码,看看它是否有效。然后取消注释一半,看它是否破裂。重复。

如果%let语句错误地抛出此错误,请显示您在SYSPARM中传递的参数值。