我正在尝试创建一个名称中带有字符“&”的文件夹
我尝试了%superq函数,该函数似乎可以正确解释宏变量
x "cd c:\Users\avibe_000\Dropbox\htdocs\Landa2018\LDPdepartments\";
data _null_;
call symput('mv1','Smith&Jones');
run;
%let testmv1=%superq(mv1);
%put &testmv1 ;
x "mkdir &testmv1";
代码可以正常工作,但会按预期创建文件夹“ Smith”,而不是“ Smith&Jones”
答案 0 :(得分:1)
DCREATE
函数将创建一个子文件夹。在宏中,使用nrstr
将未解析的值传递给函数。 %SUPERQ
本身并不是用于值分配,而是用于基于宏变量名称的按原样获取值。
filename parent 'C:\Temp';
%put NOTE: parent(path)=%qsysfunc(pathname(parent));
%let rc = %qsysfunc(DCREATE(%nrstr(Smith&Jones),parent));
filename sj 'C:\Temp\Smith&Jones';
%put NOTE: sj(path)=%qsysfunc(pathname(sj));
答案 1 :(得分:1)
宏处理器尝试处理双引号内的宏触发器。但这不在单引号内。此外,Windows命令行将需要在值两边加上引号&
。
>mkdir a&b
'b' is not recognized as an internal or external command,
operable program or batch file.
>mkdir "a&b"
因此,请更改您的过程以将命令括在单引号中,并将目录名括在双引号中。
data _null_;
call symputX('command',quote('mkdir "Smith&Jones"',"'"));
run;
x &command ;
答案 2 :(得分:1)
@Tom Nice答案。
而且您对自己的方式如此封闭:
data _null_;
call symput('mv1','d:\Users\avibe_000\Dropbox\htdocs\Landa2018\LDPdepartments\Smith&Jones');
run;
%let testmv1=%str(%")%superq(mv1)%str(%");
%put &testmv1;
x mkdir &testmv1;
答案 3 :(得分:0)
您可以使用Boemska macrocore库中的mf_mkdir
宏-这也使用dcreate()
并递归创建所需的任何子目录。它也作为宏函数提供(因此可以在代码中的几乎任何地方使用)。
/* import and compile (or go there and copy paste into your code */
filename mc url "https://raw.githubusercontent.com/Boemska/macrocore/master/base/mf_mkdir.sas";
%inc mc;
/* execute */
%mf_mkdir(/tmp/this %nrstr(&) that)
结果:
免责声明-我为Boemska工作!但是我一直在使用此宏,它永远不会让我失望。