要获取当前 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)
使用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)