【问题标题】:Using SAS and mkdir to create a directory structure in windowswindows下使用SAS和mkdir创建目录结构
【发布时间】:2012-09-13 09:20:31
【问题描述】:

我想在 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。谢谢。

【问题讨论】:

  • 不只是你,我对 X 和 UNC 路径没有任何运气。我想知道它是否与网络设置有关,某些网络会阻止它正常工作。
  • 我也会将此问题提交给 SAS 技术支持。也许他们以前见过。
  • 我刚刚尝试在我同事的计算机上运行一些测试,并且对他们来说一切正常。看起来我的机器特别奇怪。谢谢大家的帮助。如果我弄清楚它是什么,我会做出回应。

标签: windows-xp cmd sas mkdir


【解决方案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

【讨论】:

    【解决方案3】:

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

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

    另外,我在使用 UNC 路径时从来没有遇到过问题,例如

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

    【讨论】:

      【解决方案4】:

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

      options xwait xsync;
      x mkdir c:\newdirectory;
      

      【讨论】:

      • 感谢您的建议。这对我来说也很好用,但不能解决我的问题。
      【解决方案5】:

      我也在 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”是该网络 PC 上的 Windows 共享文件夹,并且已创建整个路径。也许使用SYSTEM 函数可以解决问题。我自己从来没有使用过 X 命令。

      【讨论】:

      • 感谢鲍勃的建议。不幸的是,我仍然对这种方法有同样的问题。我得到一个返回码 1 并且没有创建文件夹。我尝试同时使用 UNC 和“驱动器”表示法,然后重新启动。
      • 我一定对你的电脑有些奇怪。我尝试了可能的变化,但无法重现您收到的错误消息。我最接近的是当我尝试使用 UNC (\\W98052442n3m1\publicX\x\y\z) 引用不存在的网络共享时,但这给出了“找不到网络路径”。我一直使用 UNC 路径。
      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2018-02-06
      相关资源
      最近更新 更多