SAS - 从热键调用宏时出错(从SAS内部打开CWD)

时间:2017-08-23 19:57:47

标签: sas

我已经厌倦了手动导航到当前的工作文件夹,并希望在SAS中创建一个热键来帮助我。我设计了一个命令来从SAS中打开当前文件夹。但是,我无法通过热键执行它。

我创建了(stolen)宏:

%macro GetPwd();
  %qsubstr(
      %sysget(SAS_EXECFILEPATH)
    , 1
    , %length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))
  )
%mend;

我已将上面的GetPwd.sas保存在我的自动调用库中。

在交互模式下,我可以使用以下命令将Windows资源管理器打开到当前的SAS工作文件夹:

/*The Call:*/
%sysexec(start explorer.exe "%GetPwd()" && exit);

当我将上述调用放入KEYS菜单时,会出现问题。

enter image description here

当我通过热键(SHF F9)发出呼叫时,Windows资源管理器将打开"计算机"我在SAS中收到以下错误:

WARNING: Argument 2 to macro function %QSUBSTR is out of range.
WARNING: Argument 3 to macro function %QSUBSTR is out of range.

为什么从热键发出呼叫时会发生此错误,而在通过编辑器提交时却不会发生此错误?

我已经成功完成了使用以下方法打开SAS临时文件夹位置的类似任务:

%sysexec(start explorer.exe "%sysfunc(pathname(work))" && exit);

请参阅上面F9菜单图片中的KEYS

2 个答案:

答案 0 :(得分:1)

正如user2877959在评论中指出的那样,SAS_EXECFILEPATH和SAS_EXECFILENAME不可用,除非您已经在已保存的程序中 - 因此它们不可用,它们没有值。值得注意的是,在KEYS环境中,它们永远不可用(因为它们不存储在文件中!)。您可以通过在尚未保存的新编辑器窗口中运行代码来查看此内容。

你可以使用键盘宏来实现你想要的,或多或少;将相同的文本分配给键盘宏,然后将代码放入当前编辑器窗口中调用您的程序,然后您可以执行该程序并可选择删除。 (您甚至可以将其嵌入/* */块中,因此不必删除它。

或者,您可以让程序始终在程序开始时将当前工作目录更改为它们自己的目录(您使用相同的路径提交cd命令),这样您就可以打开探险家,让它从正确的地方开始;或者(取决于你如何启动SAS)你可以设置SAS启动时使用正确的目录开始(在快捷方式中)。如果你只需要开始几个地方,这才真正有用。

答案 1 :(得分:1)

如@ user2877959所示,似乎无法直接解决问题。在这里,我描述了我认为的第二个最佳解决方案。它需要一个技巧,我称之为"缩写宏,"它结合了keyboard macrosSAS Abbreviations的力量。这假定正在使用增强编辑器。

  1. 转到Tools > Add Abbreviation...
  2. 添加缩写
  3. 在"缩写"字段放\pwd。对于"要插入缩写"的文本,请输入呼叫%sysexec(start explorer.exe "%GetPwd()" && exit);
  4. 这就是技巧出现的地方。

    1. 导航至Tools > Keyboard Macros > Macros...。请注意,\pwd现在出现在列表中。这意味着\pwd不仅可以作为缩写,即代码片段的简写,它还可以作为一系列键盘宏命令的触发器。
    2. 选择\pwd的条目,然后选择"编辑"。从可用命令中,将以下内容分配给"键盘宏内容:"然后按" OK"。
    3. Move cursor to end of line 
      Insert carriage return 
      Insert the string "%sysexec(start explorer..." 
      Extend selection to beginning of line
      

      现在,当使用\pwd缩写时,呼叫将被放置在下一行并自动突出显示。缩写可以在任何地方发布,即使在一行代码的中间,也不会破坏已经写入的内容。要删除该行,请为"删除行"创建键盘宏。这将删除由\pwd创建的行并将源代码返回到其原始状态。