我正在尝试使用sas x command复制一组文件夹。这些文件夹包含各种类型的文件混合。
让我们假设以下文件结构
D:\tmp\Src - directory with source folders
D:\tmp\Dest - destination directory
在源目录中我对名称为Data*
的文件夹子集感兴趣,例如:Data 1
,Data 2
等。
将源和目标主目录定义为宏变量:
%let srcLoc=D:\tmp\Src;
%let destLoc=D:\tmp\Dest;
我们可以运行
x xcopy "&SrcLoc.\Data 1" "&destLoc.\Data 1" /q /i /y;
x xcopy "&SrcLoc.\Data 2" "&destLoc.\Data 2" /q /i /y;
/*etc */
一切正常。
预期修改
与时间一样,新文件夹将添加到源目录中,需要编写一个通用代码来处理符合命名Data*
的所有文件夹。
以下在Windows命令行中直接执行时执行任务所需任务
FOR /F "tokens=*" %G IN ('dir /B /A:D "D:\tmp\Src\Data*"') DO xcopy "D:\tmp\Src\%G" "D:\tmp\Dest\%G" /q /i /y
问题:
尝试从SAS中执行相同操作时:
%let srcLoc=D:\tmp\Src;
%let destLoc=D:\tmp\Dest;
/* just to test resolving of macro variables */
%put FOR /F "tokens=*" %G IN ('dir /B /A:D "&srcLoc.\Data*"') DO xcopy "&srcLoc.\%G" "&destLoc.\%G" /q /i /y;
/* the actual x-command */
x FOR /F "tokens=*" %G IN ('dir /B /A:D "&srcLoc.\Data*"') DO xcopy "&srcLoc.\%G" "&destLoc.\%G" /q /i /y;
存在以下问题:
WARNING: Apparent invocation of macro G not resolved.
和FOR /F "tokens=*" %G IN ('dir /B /A:D "&srcLoc.\Data*"') DO xcopy "D:\tmp\Src\%G" "D:\tmp\Dest\%G" /q /i /y
正如您所看到的,&srcLoc.
未解析为某个值,因为它附带了调用('dir /B /A:D "&srcLoc.\Data*"')
所需的单引号
问题:
如何确保%G
不被视为宏,并确保&srcLoc.
解析为实际值?
还有更好的方法可以在sas中完成上述任务吗?
答案 0 :(得分:1)
这可能是一种更好的方法,但现在我建议您尝试以下方法之一:
单独引用每个有问题的角色
x FOR /F "tokens=*" %nrstr(%)G IN (%bquote(')dir /B /A:D "&srcLoc.\Data*"%bquote(')) DO xcopy "&srcLoc.\%nrstr(%)G" "&destLoc.\%nrstr(%)G" /q /i /y;
在一个%
%str
字符引用所有内容
x %str(FOR /F "tokens=*" %%G IN (%'dir /B /A:D "&srcLoc.\Data*"%') DO xcopy "&srcLoc.\%%G" "&destLoc.\%%G" /q /i /y);