我的服务器上的文件夹中有一个报告模板,而不是每次需要运行报告时将模板复制到新目录中,我都希望在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,根据文档,这意味着它已成功执行,但文件名未更改。
我也尝试过在不同的文件夹和不同的文件类型中无济于事。我做错了什么?
答案 0 :(得分:2)
您的SAS会话可能已被锁定,除少数地点外无法修改文件。来自RENAME()
上的SAS documentation
如果您在其中指定FILEEXIST功能的SAS会话 处于锁定状态,并在函数中指定路径名 尚未添加到锁定路径列表,然后该函数将 失败,与锁定数据相关的文件访问错误不会 除非您指定SYSMSG功能,否则将在SAS日志中生成。
FILEEXIST
更改为RENAME
。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