#batch-file #cmd #batch-rename
#пакетный файл #cmd #пакетное переименование
Вопрос:
Я предварю это, сказав, что я вообще не программист. Я видеоредактор и консультант по постпроизводству, который заинтересован в упрощении утомительных задач или поддержании единообразия во всех структурах файлов / папок в каждом проекте.
Мне удалось собрать несколько сценариев .bat для достижения нужных мне целей, но в этом конкретном случае я столкнулся с небольшим препятствием, и поиск в Google был несколько полезным, но в основном привел к большей путанице.
У меня есть пакетный файл для создания каталогов проектов и файлов шаблонов всякий раз, когда у нас появляется новый проект.
Он просит пользователя ввести сначала номер проекта, а затем имя проекта.
Затем он создает все необходимые каталоги и копирует файлы и папки из папки шаблона во вновь созданную папку проекта
Все это работает безупречно до этого момента.
Но теперь я хочу, чтобы папки шаблонов и файлы, которые он только что скопировал, были переименованы с помощью %number%, введенного пользователем ранее.
На мой взгляд, это должно быть простым вопросом
найдите любой экземпляр «[номер проекта]» в только что созданной папке проекта и замените его на %number%
Но я не могу понять, как заставить это работать.
Любая помощь приветствуется.
Вот сценарий, который у меня есть на данный момент (примечание: я удалил лишние биты, чтобы уменьшить количество беспорядка с целью совместного использования его здесь)
@echo off
echo >>SOME INSTRUCTIONS THAT THE USER WILL SEE<<
set /p number="Enter Project Number ONLY (ex. 21-000): "
set /p project="Enter Project Name ONLY (ex. Test Project): "
MkDir "W:2021-ASSETS%number%_%project%-ASSETS%number%-Adobe Projects%number%-AE Projects"
PAUSE
copy "W:_GENERIC-Assets_Generic TemplatesAE Project Template[project number]-yymmdd.aep" "W:2021-ASSETS%number%_%project%-ASSETS%number%-Adobe Projects%number%-AE Projects"
PAUSE
xcopy "X:_FILES for new projects" "X:Projects2021 Projects%number%_%project%" /e
PAUSE
Вот где я застрял.
Папка «_FILES для новых проектов» содержит структуру файлов / папок, которые имеют такие имена, как «Аудио- [номер проекта]», «Графика- [номер проекта]» и так далее. Я хочу, чтобы в этой заключительной части скрипта были найдены все экземпляры [номер проекта] (независимо от того, является ли это файлом или каталогом) и заменить его на%число%, введенное пользователем в начале.
Я знаю, что могу использовать что-то вроде утилиты массового переименования, но я надеялся сделать переименование частью скрипта, чтобы убедиться, что оно выполняется последовательно. Люди, которые будут использовать это, не очень техничны и порой сдержанны, когда дело доходит до внесения изменений в вещи, поэтому, чем проще для них, тем лучше. Интерфейс утилиты массового переименования очень загроможден и перегружает их, поскольку они не знают, правильно ли они это делают. Кроме того, это добавляет дополнительный шаг к процессу создания нашего проекта, который может быть пропущен по ошибке.
Заранее спасибо за вашу помощь / совет.
Также обратите внимание, что PowerShell — это не вариант. Кто-то помог мне на reddit и предоставил мне PS-скрипт, но ИТ-политика компании пометила / заблокировала его и не позволила мне протестировать. В нем говорилось, что они могут предоставить мне исключение для его запуска, но это также означает, что я буду единственным человеком в нашей команде, имеющим доступ к запуску PS-скрипта. Это не вариант.
Комментарии:
1. Первый совет, который я бы посоветовал, — потратить гораздо больше времени на улучшение своего кода, чтобы проверить вводимые пользователями данные. Принимая во внимание, что ваш конечный пользователь в настоящее время не может вводить ничего или вообще ничего в каждом приглашении (включая недоразумения, ошибки typimg и злой умысел) , и это
%number%
будет расширено в многопайловых расположениях, вложенных в дерево. Я бы предположил, что это важно, чтобы вы это сделали.
Ответ №1:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "targetdir=u:your files"
rem constant strings
SET "projectnumber=[project number]"
rem data that has been entered
SET "number=12345"
FOR /f "delims=" %%a IN (
'dir /b /s "%targetdir%*%projectnumber%*" '
) DO (
SET "namestring=%%~nxa"
SET "newnamestring=!namestring:%projectnumber%=%number%!"
ECHO REN "%%a" "!newnamestring!"
)
Пожалуйста, обратите внимание, использование delayedexpansion
которого позволяет !var!
получить доступ к значению переменной var
по мере его изменения во время выполнения for
цикла. Обратите внимание, что %var%
он обращается к значению var
в момент возникновения цикла. Есть много, очень много статей SO об этом — просто используйте search
средство.
for
Цикл анализирует dir
список всех файлов и каталогов, найденных в каталоге, определенном как targetdir
совпадающие с именем-mask *%projectnumber%*
=, то есть содержащие строку, определенную как projectnumber
ранее установленную.
В SO стандартной практикой является использование синтаксиса set "var=value"
для назначения строк, поскольку это гарантирует, что случайные конечные пробелы в строке игнорируются. В случае с вашим set /p
, используйте, например set /p "project=Enter Project Name ONLY (ex. Test Project): "
.
Этот delims=
параметр гарантирует, что полное имя файла/каталога будет присвоено %%a
(the metavariable
.
Затем переменной присваивается часть N ame и e X tension значения в %%a
(%% ~ NX a) namestring
, поскольку следующий шаг должен быть применен к переменной, а не к метапеременной.
Вычислите newnamestring , установив для него текущее значение namestring
( !namestring!
) , но после замены строки, определенной как projectnumber
( %projectnumber%
) , на строку, определенную как number
.
Затем ECHO
требуемая ren
команда. Ren
переименовывает файл или каталог, но новое имя может содержать только части имени и расширения, а не диск и путь.
Итак, после запуска этого кода вы обнаружите, что он выдает на экран отчет о переименованиях, которые он намеревается выполнить. Это мера безопасности для ручной проверки соответствия команд. Если все соответствует Хойлу, удалите echo
ключевое слово, и будет применено переименование.
Примечание: пакет, как правило, не чувствителен к регистру, поэтому NX может быть в любом случае. Единственным распространенным исключением из этого является метапеременная a
, которая должна быть последовательно в одном и том же регистре, чтобы ссылаться на одну и ту же метапеременную.