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

5

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

\\computername\downloads\x\y\z

我在网上看到很多关于SAS的例子,使用通过%sysexec()或者x命令调用的DOS mkdir 命令。这个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 32位,SAS 9.3 TS1M2。谢谢。


不仅是你,我在使用X和UNC路径时也没有成功过。我想这可能与网络设置有关,某些网络会阻止其正常工作。 - Joe
我也打算向SAS技术支持提交这个问题。或许他们之前见过类似的情况。 - Robert Penridge
我刚刚在我的同事电脑上运行了一些测试,他们都正常运行。看起来这是我机器特别奇怪的问题。感谢大家的帮助。如果我弄清楚了是什么问题,我会回复的。 - Robert Penridge
5个回答

4

2
我也在使用WinXP,并且使用的是SAS 9.3 TS1M1。下面的内容对我来说也如广告所述一样有效:
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"是该网络电脑上的Windows共享文件夹,并创建了整个路径。也许使用SYSTEM函数起到了作用。我从未自己使用过X命令。

谢谢你的建议,Bob。不幸的是,我用这种方法仍然遇到了同样的问题。我得到了一个返回代码为1,没有文件夹被创建。我尝试了UNC和“驱动器”符号,并重新启动了计算机。 - Robert Penridge
你的电脑可能有些奇怪。我尝试了很多变化,但无法重现你收到的错误消息。最接近的一次是当我尝试使用UNC引用不存在的网络共享(\W98052442n3m1\publicX\x\y\z)时,但那只是显示“未找到网络路径”。我经常使用UNC路径。 - BellevueBob

2

您需要使用 mkdir 命令的选项 -p,这将创建所有子文件夹。

例如:

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

2
您需要引用您的x命令,例如:

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

此外,我从未遇到过使用UNC路径的问题,例如:
x "\\server.domain\share\runthis.exe" ;

1

这似乎可以正常工作,而DOS窗口仍然保持打开状态。您可能需要使用XSYNC选项。我正在MAC上的VMWARE下使用9.3 TS1M1 64位版本:

options xwait xsync;
x mkdir c:\newdirectory;

谢谢建议。对我来说那也可以,但它并没有解决我的问题。 - Robert Penridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接