使用SAS和mkdir在Windows中创建目录结构

问题描述 投票:4回答:5

我想在SAS中从Windows中创建一个目录结构。最好使用一种允许我指定UNC命名约定的方法,例如:

\\computername\downloads\x\y\z

我在网上看到了很多使用DOS mkdir命令通过%sysexec()xcommand命令的SAS示例。关于mkdir命令的好处是,如果它们也不存在,它将创建任何中间文件夹。我从提示符中成功测试了下面的命令,它的行为符合预期(引用似乎并不重要,因为我的路径名中没有空格):

mkdir \\computername\downloads\x\y\z
mkdir d:\y
mkdir d:\y\y
mkdir "d:\z"
mkdir "d:\z\z"
mkdir \\computername\downloads\z\z\z
mkdir "\\computername\downloads\z\z\z"

以下从SAS运行良好:

x mkdir d:\x;
x 'mkdir d:\y';
x 'mkdir "d:\z"';
x mkdir \\computername\downloads\x;
x 'mkdir \\computername\downloads\y';

但是这些在从SAS运行时不起作用,例如:

x mkdir d:\x\x;
x 'mkdir d:\y\y';
x 'mkdir "d:\z\z"';
x mkdir \\computername\downloads\x\y\z ;
x 'mkdir "\\computername\downloads\z"';

** OR **;

%sysexec mkdir "\\computername\downloads\x\y\z ";

** OR **;

filename mkdir pipe "mkdir \\computername\downloads\x\y\z";
data _null_;
  input mkdir;
  put infile;
run;

这是行不通的。不仅这个,但窗口立即关闭,即使我指定了options xwait,所以没有机会看到任何错误消息。我已尝试使用UNC路径和驱动器号路径的所有方法,即。 D:\downloads\x\y\z

如果我查看操作系统返回的错误消息:

%put %sysfunc(sysrc()) %sysfunc(sysmsg());

我得到以下内容:

-20006 WARNING: Physical file does not exist, d:\downloads\x\x\x.

查看mkdir命令的文档,它似乎只支持在启用“命令扩展”时创建中间文件夹。这可以通过将/E:ON添加到cmd.exe来实现。我已经尝试更改我的代码使用:

cmd.exe /c /E:ON mkdir "\\computername\downloads\x\y\z"

仍然没有运气!

任何人都可以告诉我为什么互联网上的其他人似乎能够从SAS内部工作除了我?同样,它在DOS提示符下工作正常 - 只是不在SAS内部。

我更喜欢专门解决这个问题的答案(我知道还有其他解决方案使用多个步骤或dcreate())。

我正在运行WinXP 32Bit,SAS 9.3 TS1M2。谢谢。

windows-xp cmd sas mkdir
5个回答
1
投票

您需要使用mkdir选项-p,它将创建所有子文件夹

x mkdir -p "c:\newdirectory\level 1\level 2";

2
投票

这是一个使用LIBNAME语句创建目录的技巧

options dlcreatedir; libname newdir "/u/sascrh/brand_new_folder";

我相信这比X声明更可靠。

资料来源:SAS trick: get the LIBNAME statement to create folders for you


1
投票

我也使用SAS 9.3 TS1M1在WinXP上。以下为我宣传的作品:

122  options noxwait;
123  data _null_;
124    rc = system('mkdir \\W98052442n3m1\public\x\y\z');
125    put rc=;
126  run;

rc=0
NOTE: DATA statement used (Total process time):
      real time           1.68 seconds
      cpu time            0.03 seconds

那是我的实际日志文件; “public”是该网络PC上的Windows共享文件夹,并且创建了整个路径。也许使用SYSTEM函数就可以了。我自己从未使用过X命令。


1
投票

你需要引用你的x命令,例如

x 'mkdir "c:\this\that\something else"' ;

此外,我从未遇到使用UNC路径的问题,例如

x "\\server.domain\share\runthis.exe" ;

0
投票

这似乎与dos窗口保持打开状态一样好。您可能需要XSYNC选项。我在MAC上的VMWARE下使用9.3 TS1M1 64位:

options xwait xsync;
x mkdir c:\newdirectory;
© www.soinside.com 2019 - 2024. All rights reserved.