使用SAS X命令复制文件夹:引号和特殊字符问题

时间:2015-10-01 14:31:27

标签: windows command-line sas

我正在尝试使用sas x command复制一组文件夹。这些文件夹包含各种类型的文件混合。

让我们假设以下文件结构

D:\tmp\Src - directory with source folders
D:\tmp\Dest - destination directory

在源目录中我对名称为Data*的文件夹子集感兴趣,例如:Data 1Data 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中完成上述任务吗?

1 个答案:

答案 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);