SAS:将当前文件夹设置为包含正在运行的程序的文件夹

Sha*_*ing 5 sas

我刚刚开始学习SAS,因为我需要将它用于统计课程.对于本课程,大学通过其虚拟机设置提供SAS 9.2:我在他们的系统中进行预约,他们在其中一台服务器上生成VM,然后使用Microsoft的远程桌面客户端连接到VM.每个会话生成并擦除虚拟机; 每次都重置设置,文件必须存储在我的客户端计算机上(可通过UNC路径在VM中访问).

在此设置中,当我打开存储在笔记本电脑上的程序文件时,我只能通过硬编码完整路径或更新"当前"来访问随附的数据文件(每个文件都存储在与程序相同的文件夹中)文件夹"在每个会话开始时设置.第一个是有问题的,因为这意味着程序不会在其他任何地方运行 - 特别是当我通过电子邮件发送给教授时.第二个是不方便的,因为浏览到这个特定的UNC路径是耗时的,我已经必须浏览到相同的路径来打开程序文件.

我想通过以编程方式将当前文件夹设置为包含该程序的文件夹来使这更容易.然后我可以打开文件然后开始工作.我找到了一些获取程序文件的文件名,获取文件参数的路径以及(超出链接限制)设置当前文件夹的示例,但我无法以正确的方式将它们组合在一起.请为我连接点.

Sha*_*ing 1

完整答案:

SAS 的钝表示法需要一些奇怪的分隔符来将我的部分解决方案(查找路径)与@Bob Duell 的部分解决方案(设置当前文件夹)结合起来。似乎涉及两个关键规则:

  • &var 在双引号字符串 ("&var") 中扩展,但在单引号字符串 ('&var') 中不扩展
  • &var 中的引号在扩展后不被视为分隔符

因此,解决方案是计算带引号的路径的字符串(其中引号是字符串的一部分),并将双引号参数中的该字符串扩展为 X 或 SYSTEM:

%let qsrc=%str(%")&src%str(%");
X "cd &qsrc"
Run Code Online (Sandbox Code Playgroud)

不需要存储字符串, &src 和 &qsrc 都可以就地扩展,这会产生单语句解决方案:

X "cd %str(%")%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))))%str(%")";
Run Code Online (Sandbox Code Playgroud)

这可以正确执行,但会破坏 GUI 中的语法着色。在字符串中,%str(%")""都扩展为",因此替换%str(%")""都可以正确执行,并且在 GUI 中正确着色:

X "cd ""%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))))""";
Run Code Online (Sandbox Code Playgroud)

这继承了仅在定义 SAS_EXECFILEPATH 和 SAS_EXECFILENAME 时才起作用的限制,即从 Windows GUI 编辑器中运行时的情况。它还受到“cd”命令的任何限制,SAS 会拦截该命令而不是调用 Windows 命令行。我预计它会在包含引号的路径上失败。