Применить префикс произвольной длины к каталогу файлов с командным файлом - PullRequest
0 голосов
/ 24 января 2019

У меня есть существующий пакетный файл, в то время как я использую для создания файлов проекта из набора файлов шаблонов.Пакетный файл создает структуру папок и копирует в них серию файлов.Большинство этих файлов названы с использованием той же структуры, например:

PPPP-123_456a.dwg

В моем пакетном файле в настоящее время используется следующая строка для замены «PPPP» на фактический номер проекта:

for /r "%ProjDir%" %%f in (PPPP*) do (rename "%%f" "%ProjectNumber%*")

Где ProjDir - это путь к папке, созданной пакетным файлом, а ProjectNumber - номер проекта.

Что отлично работает.Моя проблема в том, что некоторые номера проектов клиентов теперь до 5 цифр, в то время как другие номера проектов на 4 цифры.Мне нужно изменить эту строку, чтобы она корректно работала с 4- или 5-значными номерами проектов.

То, что я пробовал:

Если я использую его как есть с номером проекта 12345, мой файлимя меняется с PPPP-123_456a.dwg на 12345123_456a.dwg - вместо вставки дополнительного символа команда переименования просто перезаписывает существующие символы, поэтому я теряю первую черту в имени файла.

Если я переименую все файлы шаблоначтобы начать с PPPPP, я не могу использовать его для четырехзначного номера проекта, или результат будет 1234P-123_456a.dwg.

Если я удаляю все ведущие буквы P из файлов шаблонов, а затем изменяюкод для:

for /r "%ProjDir%" %%f in (PPPP*) do (rename "%%f" "%ProjectNumber%%%f")

… затем он пытается применить префикс номера проекта к началу пути к файлу, а не к имени файла (т.е. он пытается переименовать C: /Test/-123_456a.dwgдо 12345C: /Test-123_456a.dwg).Похоже, это моя ближайшая попытка, мне просто нужно найти способ заставить его применять префикс к части имени файла строки, а не ко всей строке.Но я не уверен, как это сделать.

TL; DR, Как я могу использовать командный файл, чтобы правильно применить префикс произвольной длины к каталогу файлов?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Извиняюсь за радиомолчание, вызван на более срочный проект.

Мне удалось немного упростить вещи, удалив PPPP из начала каждого файла, а затем просто создав новое имя файла, как предложил @aschipfl. Это также позволяет мне использовать ту же технику для нескольких других файлов, которые не следуют той же структуре имени файла, что и выше.

for /r "%ProjDir%" %%f in (*.dwg) do (rename %%f %ProjectNumber%%%~nf%%~xf)

% ProjectNumber% возвращает номер проекта с любым количеством цифр

%% ~ nf возвращает имя файла, с которым выполняется операция

%% ~ xf возвращает расширение файла, на котором выполняется операция

Сначала я также пытался использовать %% ~ df и %% ~ pf для извлечения компонентов диска и пути нового имени файла, но TIL, что при использовании команды переименования необходимо указать полный путь к файлу в источнике файл, но только имя файла в файле назначения

0 голосов
/ 24 января 2019

Проблема заключается в команде rename, которая при использовании prefix* в качестве нового имени заменяет столько символов в начале, сколько содержится в prefix.Поэтому вам нужно создать новое имя самостоятельно, а не позволять rename попытаться сделать это:

rem /* Walk through the project directory tree and search for all files whose names
rem    match a template with either a 4-digit or a 5-digit project number prefix: */
for /R "%ProjDir%" %%F in ("PPPP-*.*" "PPPPP-*.*") do (
    rem // Split the pure file name at the first hyphen to get the prefix and the rest:
    for /F "tokens=1* delims=-" %%I in ("%%~nxF") do (
        rem // Build the new file name by replacing the prefix by the project number:
        rename "%%F" "%ProjectNumber%-%%J"
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...