如何在没有x / system命令的情况下从SAS EG复制和重命名外部文件?

时间:2018-02-07 14:29:57

标签: sas

我的服务器上的文件夹中有一个报告模板,而不是每次需要运行报告时将模板复制到新目录中,我都希望在SAS中自动化它。

我已尝试使用x命令和system(),如下所示:

data _null_; rc = system('copy "\\servername\Reports\Reporting Templates\Template.xlsm" "\\servername\Output\Template_new.xlsm") put rc =; run;

但我遇到了错误ERROR: Shell escape is not valid in this SAS session.,这似乎与安全相关,我需要管理员权限来激活该选项。

然后从谷歌搜索,我遇到了https://www.sas.com/content/dam/SAS/en_ca/User%20Group%20Presentations/TASS/Jia_Lin_Manage_External_Files_June2015.pdf 提及在SAS数据步骤中使用rename()函数重命名外部文件(并复制到新文件夹,作者声称)。但是,我无法让它发挥作用。

data _null_; rc = rename("\\servername\Reports\Reporting Templates\Template.xlsm", "\\servername\Reports\Reporting Templates\Template_new.xlsm", "file"); put rc=; run;

当我检查日志时,我没有错误,rc的值为1,根据文档,这意味着它已成功执行,但文件名未更改。

我也尝试过在不同的文件夹和不同的文件类型中无济于事。我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的SAS会话可能已被锁定,除少数地点外无法修改文件。来自RENAME()上的SAS documentation

  

如果您在其中指定FILEEXIST功能的SAS会话   处于锁定状态,并在函数中指定路径名   尚未添加到锁定路径列表,然后该函数将   失败,与锁定数据相关的文件访问错误不会   除非您指定SYSMSG功能,否则将在SAS日志中生成。

  1. 干得好,SAS文档小组在复制和粘贴过程中不会将FILEEXIST更改为RENAME
  2. 使用SYSMSG()函数查看是否存在未传播到日志的错误。

答案 1 :(得分:0)

我的问题是服务器名称中的错误,但我认为@ DomPazz的答案仍然有用,评论为我提供了几个替代方案,可以形成这个问题的合适答案:

<强> 1。重命名声明

data _null_;
  rc = rename("\\servername\Reports\Reporting Templates\Template.xlsm",
              "\\servername\Output\Template_new.xlsm",
              "file");
  put rc=;
run;

<强> 2。文件名为FCOPY

注意:当我使用FCOPY移动启用宏的工作表(.xlsm)时,它损坏了文件,我不得不用rename()

filename src "\\servername\Reports\Reporting Templates\Template.xlsm",
filename dest "\\servername\Output\Template_new.xlsm"   

data _null_;
  rc = fcopy('src', 'dest');
  put rc=;
run;

第3。二进制复制 我还没有测试过的另一种方法,但是以块的形式复制文件而不是逐字节复制。一个使用%mp_binarycopy()宏。 Github回购在这里: https://github.com/Boemska/macrocore/blob/master/base/mp_binarycopy.sas

此SAS博客文章中描述的另一种类似方法,带有代码链接: https://blogs.sas.com/content/sasdummy/files/2013/09/binaryfilecopy.sas_.txt