Когда наши пользователи создают новую папку Project, я хотел бы, чтобы она автоматически копировала структуру папок шаблона и разрешения шаблона. Пока что единственное, что я придумал, - это пакетный сценарий, который запрашивает у пользователя имя проекта, а затем вызывает robocopy для копирования шаблона папки. В моем тестировании это сработало достаточно хорошо, но не очень удобно для пользователя. Я также столкнулся с небольшой проблемой, когда я фактически детализировал полную структуру папок вместо того, чтобы тестировать шаблон и место назначения в плоской тестовой папке. Я ищу лучший способ сделать это, и если это невозможно, то решение моего скрипта robocopy для обработки мест назначения {текущая папка} {папка с именем в выборе}.
Корневая папка - это общий сетевой ресурс, расположенный на сервере Windows с аутентификацией Active Directory.
Это расположение папки шаблона: \ ServerName \ Common \ Projects_Template
Здесь создаются новые папки проекта: \ ServerName \ Common \ Projects \ Region \ State {NewProject}
Вот сценарий robocopy, который я до сих пор разбил по разделам. Копия сценария хранится в каждой папке состояния, поэтому пользователь просто переходит в правильное состояние и запускает в нем файл сценария. В этом первом разделе пользователю предлагается назвать новую папку проекта и сохраняет это имя в переменной. При краткой проверке ошибок вопрос будет повторно задан, если пользователь ввел ошибку или выбрал другое имя.
SET /P fold= Enter the project name:
CHOICE /M "Is this correct: %fold%"
IF %ERRORLEVEL% equ 2 CLS & GOTO start
Этот раздел должен скопировать папку шаблона в папку текущего состояния, но назвать ее именем, введенным в разделе выбора. Во время первоначального тестирования я просто использовал жесткие места, но я не хочу создавать отдельный пакетный файл для каждой папки состояний. Раздел ". \% Fold%" не работает, как я ожидал, и я подозреваю, что это частично связано с тем, что командный файл запускается из сетевого расположения. Как есть, он создает указанную папку в папке C: \ Windows \% fold% на локальном компьютере пользователя, запускающего сценарий. Папка шаблона скрыта, поэтому / A-: H находится там, а / XX предназначен для предотвращения любого ущерба, если пользователь случайно вводит точное имя существующей папки проекта, в которой есть данные, а / MIR / SEC и / SECFIX предназначены для копирования точных разрешений из папки шаблона.
robocopy "\\ServerName\Common\Projects\_Template\\" .\%fold% /MIR /SEC /SECFIX /XX /A-:H >nul 2>nul
В идеале, если пользователь находится в папке состояния и нажимает «Новая папка», он сделает все это за него, но я не знаю, как встроить это в функции проводника Windows. Кроме того, нет существующего тега для "Структура папки"?
Оказывается, ответ состоит в том, чтобы использовать аргумент командной строки с расширениями параметров, чтобы включить текущий диск и путь в качестве части аргумента назначения robocopy. Этот аргумент %~dp0
.
Вот отрывок из http://ss64.com/nt/syntax-args.html что помогло мне понять это:
Ссылки относительно пакетного скрипта
Вы можете получить путь к самому пакетному сценарию с помощью% 0, к нему могут быть применены расширения параметров, поэтому% ~ dp0 вернет диск и путь к пакетному сценарию, например. W: \ scripts \ и% ~ f0 вернет полный путь W: \ scripts \ mybatch.cmd
Вы можете ссылаться на другие файлы в той же папке, что и пакетный сценарий, используя следующий синтаксис:
ВЫЗОВ% 0 .. \ SecondBatch.cmd
Это даже можно использовать в подпрограмме, Echo% 0 даст метку вызова, но echo "% ~ nx0" даст вам имя файла пакетного скрипта.
Когда переменная% 0 раскрывается, результат заключен в кавычки.
В пакетном скрипте это выглядит так:
SET /P fold= Enter the project name:
CHOICE /M "Is this correct: %fold%"
IF %ERRORLEVEL% equ 2 CLS & GOTO start
robocopy "\\ServerName\Common\Projects\_Template\\" "%~dp0\%fold%" /MIR /SEC /SECFIX /XX /A-:H >nul 2>nul
Фактически это говорит:
Скопируйте папку _Template на текущий диск \ путь как новую папку с именем, введенным пользователем из команды SET. Вся структура папок будет зеркально отражена, включая данные, атрибуты, отметки времени и безопасность. Предотвратите любые удаления из места назначения (если папка уже существует и в ней есть файлы, это должно помешать / mir уничтожить эти файлы). Удалите скрытый атрибут из папки при ее копировании и предотвратите отображение сообщений об ошибках, отправив их на nul.
Другие примечания: если ваш исходный или целевой путь заключен в двойные кавычки (чтобы разрешить пробелы), вы не можете закончить путь одним \
потому что он рассматривается как escape-символ и, таким образом, вызывает завершающий "
считаться частью пути, а не конечным "
что, конечно, приводит к разделению пути в пространстве. Решение (при условии, что вы не всегда можете гарантировать, что путь никогда не будет содержать пробелов) состоит в том, чтобы либо оставить конечный \
полностью или удвоить его, чтобы он ускользнул сам (как показано в приведенном выше фрагменте кода). Я пока не знаю, что лучше всего для этого сделать, поскольку мне всегда говорили, что \
указывает папку, оставляя конечный \
указывает на файл.