在 sysget 调用的输出中屏蔽与号

The*_*kel 2 sas

要获取当前 SAS 程序的文件名,我们可以编写

%put %sysget(SAS_EXECFILEPATH);
Run Code Online (Sandbox Code Playgroud)

我很不幸,有人曾经创建了一个目录,在路径中包含一个&符号(哎呀!)。让我们创建一个示例文件夹C:\temp&other并将我们的test.sas程序存储在该文件夹中。

现在,我的问题是:

是否可以屏蔽输出%sysget(SAS_EXECFILEPATH)以避免 SAS 尝试解析宏变量&other

简单的解决方案是更改路径名,但不幸的是事情并不总是那么容易,我不允许更改文件夹名称。


我的尝试:我尝试过的所有nr功能都没有帮助我,因为它们屏蔽了%&. 我尝试了以下(缩进的行是 SAS 日志输出)。请注意,%NRQUOTE输出与“裸”调用相同。

%put %sysget(SAS_EXECFILEPATH); 
    /* WARNING: Apparent symbolic reference OTHER not resolved. */
    /* C:\temp&other\test.sas */

%put %nrstr(%sysget(SAS_EXECFILEPATH));
    /* %nrstr(%sysget(SAS_EXECFILEPATH)) */

%put %nrquote(%sysget(SAS_EXECFILEPATH));
    /* WARNING: Apparent symbolic reference OTHER not resolved. */
    /* C:\temp&other\test.sas */

%put %superq(%sysget(SAS_EXECFILEPATH));
    /* WARNING: Apparent symbolic reference OTHER not resolved.*/
    /* ERROR: Invalid symbolic variable name C\TEST&OTHER\TEST.SAS. */
Run Code Online (Sandbox Code Playgroud)

Stu*_*ski 5

使用data _null_步骤 withcall symputx创建一个宏变量来保存 的值sas_execfilepath。然后您可以使用%superq().

data _null_;
    call symputx('sas_execfilepath', sysget('sas_execfilepath'));
run;

%put %superq(sas_execfilepath);
Run Code Online (Sandbox Code Playgroud)

日志输出:

C:\temp&other\test.sas
Run Code Online (Sandbox Code Playgroud)