Использование SAS и mkdir для создания структуры каталогов в Windows

Я хочу создать структуру каталогов в 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. Спасибо.


person Robert Penridge    schedule 20.09.2012    source источник
comment
Это не только вам, мне не повезло с путями X и UNC. Интересно, это как-то связано с настройкой сети, когда некоторые сети не позволяют ему работать должным образом.   -  person Joe    schedule 21.09.2012
comment
Я также собираюсь сообщить об этой проблеме в службу технической поддержки SAS. Может быть, они видели это раньше.   -  person Robert Penridge    schedule 21.09.2012
comment
Я только что попробовал провести несколько тестов на компьютерах моего коллеги, и у них все прошло нормально. Похоже, это что-то особенно странное с моей машиной. Спасибо всем за помощь. Я отвечу, если когда-нибудь узнаю, что это такое.   -  person Robert Penridge    schedule 21.09.2012


Ответы (5)


Вам нужно использовать опцию mkdir -p, которая создаст все подпапки

i.e.

x mkdir -p "c:\newdirectory\level 1\level 2";
person Mark hallam    schedule 30.07.2013
comment
Ага. Это исправило это. Огромное спасибо. - person Robert Penridge; 31.07.2013

Вот трюк, который использует оператор LIBNAME для создания каталога

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

Я считаю, что это более надежно, чем утверждение X.

Источник: Трюк SAS: получите Оператор LIBNAME для создания папок для вас

person Andrew    schedule 14.09.2018

Я тоже на 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.

person BellevueBob    schedule 21.09.2012
comment
Спасибо за предложение Боб. К сожалению, у меня все еще есть такая же проблема с этим подходом. Я получаю код возврата 1, и папки не создаются. Я попробовал как UNC, так и «диск», и я перезагрузился. - person Robert Penridge; 21.09.2012
comment
Я должен быть что-то странное о вашем компьютере. Я пробовал разные варианты, но не могу воспроизвести полученное вами сообщение об ошибке. Ближе всего я подошел, когда попытался сослаться на несуществующий сетевой ресурс с UNC (\\W98052442n3m1\publicX\x\y\z), но это дало сетевой путь не найден. Я постоянно использую пути UNC. - person BellevueBob; 21.09.2012

Вам нужно указать свои команды x, например.

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

Кроме того, у меня никогда не было проблем с использованием путей UNC, например.

x "\\server.domain\share\runthis.exe" ;
person Chris J    schedule 21.09.2012

Кажется, это прекрасно работает, когда окно dos остается открытым. Вам может понадобиться опция XSYNC. Я использую 9.3 TS1M1 64 бит под VMWARE на MAC:

options xwait xsync;
x mkdir c:\newdirectory;
person RosaryGuy    schedule 21.09.2012
comment
Спасибо за предложение. Это также отлично работает для меня, но это не решает мою проблему. - person Robert Penridge; 21.09.2012