Стандартный метод создания структуры каталогов:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"
md "%Directory%" 2>nul
if not exist "%Directory%\*" (
echo Failed to create directory "%Directory%"
pause
goto :EOF
)
rem Other commands after successful creation of the directory.
endlocal
По умолчанию расширения команд включены, а отложенное раскрытие отключено. Пакетный код выше явно настраивает эту среду.
Команда MD создает полную структуру каталогов для указанного каталога с включенными расширениями команд.
MD выдает ошибку, если каталог уже существует. Это может быть полезно для информирования пользователя, вводящего команду вручную, о возможной ошибке во введенном пути к каталогу, поскольку возможно, что пользователь хотел создать новый каталог и по ошибке ввел имя уже существующего каталога.
Но при использовании команды MD в сценарии часто возникает проблема, когда эта команда выводит сообщение об ошибке, если каталог, который нужно создать, уже существует. Было бы действительно полезно, если бы в команде MD была возможность не выводить сообщение об ошибке в случае создания каталога, который уже существует, и выхода с кодом возврата 0 в этом случае. Но такого варианта нет.
Приведенное выше решение создает каталог и подавляет возможное сообщение об ошибке вывода, перенаправляя его с дескриптора STDERR на устройство NUL.
Но создание каталога может завершиться неудачно из-за недопустимого символа в пути к каталогу, диск недоступен (при использовании полного пути), в любом месте пути есть файл с именем указанного каталога, разрешения NTFS не разрешают создание каталога , и т.д.
Поэтому рекомендуется проверить, действительно ли существует каталог, что выполняется с помощью:
if not exist "%Directory%\*"
Важно, чтобы путь к каталогу теперь заканчивался \*
или, по крайней мере, обратной косой чертой. В противном случае возможно, что в примере есть файл с именем subdir 2
в каталоге mydir\subdir 1
, который при использовании условия if not exist "%Directory%"
будет оцениваться как false, хотя каталога subdir 2
нет.
Конечно, также можно сначала выполнить проверку каталога и создать каталог, если он еще не существует.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"
if not exist "%Directory%\*" (
md "%Directory%"
if errorlevel 1 (
pause
goto :EOF
)
)
rem Other commands after successful creation of the directory.
endlocal
Теперь пользователь может увидеть вывод сообщения об ошибке с помощью команды MD, если структура каталогов не может быть создана, с кратким объяснением причины.
Этот пакетный код можно было бы написать более компактно с помощью оператора ||
:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"
if not exist "%Directory%\*" md "%Directory%" || (pause & goto :EOF)
rem Other commands after successful creation of the directory.
endlocal
Подробнее об операторах ||
и &
читайте в ответе на Одна строка с несколькими командами с использованием командного файла Windows.
Команда ENDLOCAL не используется перед goto: EOF, поскольку для этой команды также требуются включенные расширения команд. Интерпретатор команд Windows выполняет эту команду неявно после выхода из выполнения командного файла.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.
echo /?
endlocal /?
goto /?
if /?
md /?
pause /?
set /?
setlocal /?
Прочтите также статью Microsoft об использовании операторов перенаправления команд.
06.07.2017