Я хочу создать структуру каталогов в Windows из SAS. Предпочтительно использовать метод, который позволит мне указать соглашение об именах UNC, например:
\\computername\downloads\x\y\z
Я видел много примеров для SAS в Интернете с использованием команды DOS mkdir
, вызываемой через %sysexec()
или команду x
. Хорошая вещь в команде 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. Спасибо.