首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将当前文件夹设置为包含正在运行的程序的文件夹

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

Stack Overflow用户
提问于 2013-01-19 08:09:55
回答 3查看 13.7K关注 0票数 5

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

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

我想通过以编程方式将当前文件夹设置为包含程序的文件夹来简化此操作。然后我就可以打开文件开始工作了。我已经找到了一些getting the filename of the program filegetting the path to a fileref和(超过链接限制)设置当前文件夹的示例,但我无法以正确的方式将它们组合起来。请帮我把这些点连起来。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-20 02:54:56

完整答案:

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

在展开之后,&var中的单引号字符串不被视为分隔符,而是双引号字符串("&var")中的分隔符

  • &var被扩展

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

代码语言:javascript
运行
复制
%let qsrc=%str(%")&src%str(%");
X "cd &qsrc"

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

代码语言:javascript
运行
复制
X "cd %str(%")%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))))%str(%")";

这将正确执行,但会破坏GUI中的语法着色。在字符串中,%str(%")""都扩展为",因此用""替换%str(%")既可以正确执行,也可以在图形用户界面中正确着色:

代码语言:javascript
运行
复制
X "cd ""%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))))""";

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-19 23:02:48

要以编程方式从SAS更改Windows当前目录,您可以使用X命令,这是使用“更改当前文件夹”对话框时实际发生的情况:

代码语言:javascript
运行
复制
x 'cd "\\computername\share name\folder"';

您也可以使用SYSTEM data step函数来完成此操作,我更喜欢这种方法,因为您会得到一个返回码(当然还有更多的输入):

代码语言:javascript
运行
复制
data _null_;
   rc = system( 'cd "\\computername\share name\folder"' );
   if rc = 0 
      then putlog 'Command successful';
      else putlog 'Command failed';
run;

请注意,UNC路径用双引号括起来,如果路径包含空格,则必须使用双引号。

当然,这仍然需要您手动键入命令,但这可能是您可以添加到程序源代码中的内容。如果您的VM环境允许您在服务器上保持一些永久存在,则可以将此命令保存到启动文件中。

我会向你的教授请教;如果你使用的是作为课程一部分的数据,你可能只需要发送源代码。另一方面,如果你正在创建输出数据作为作业的一部分,你的教授可能会希望你交付源代码和SAS数据集。他或她肯定会有一些程序。

票数 3
EN

Stack Overflow用户

发布于 2013-01-20 01:29:30

部分答案:从程序文件的文件名中获取包含文件夹的一种方法

展开日志步骤(&L):

代码语言:javascript
运行
复制
/* Find PathName of folder containing program */
%let FullName=%sysget(SAS_EXECFILEPATH);
%put FullName: &FullName.;
%let FullLen=%length(&FullName);
%put FullLen: &FullLen.;
%let BaseName=%sysget(SAS_EXECFILENAME);
%put BaseName: &BaseName.;
%let BaseLen=%length(&BaseName);
%put BaseLen: &BaseLen.;
%let PathLen=%eval(&FullLen.-&BaseLen.);
%put PathLen: &PathLen.;
%let PathName=%substr(&FullName,1,&PathLen);
%put PathName: &PathName.;

合并和静默:

代码语言:javascript
运行
复制
/* Find src folder */
%let src=%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))));

这只在定义了SAS_EXECFILEPATH和SAS_EXECFILENAME时才起作用,并且还不清楚是什么时候。当使用Windows GUI编辑器时,它确实起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14409689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档