Я столкнулся со следующей проблемой, пытаясь переименовать несколько сотен изображений в папке (это данность, на которую я не могу повлиять).
Все файлы имеют структуру "имя{пробел}суффикс.JPG".
Таким образом, изображения могут иметь одинаковыеимя, но в этом случае отличаются своимсуффикс. Например
L083192 (1).JPG
L083192 (2).JPG
L083192 (3).JPG
L083192 (4).JPG
или
L081473 a.JPG
L081473 b.JPG
Цель состоит в том, чтобы добавить счетчик (как префикс) ко всем изображениям с одинаковым именем. Т.е.
1_L083192 (1).JPG
1_L083192 (2).JPG
1_L083192 (3).JPG
1_L083192 (4).JPG
[..]
16_L081473 a.JPG
16_L081473 b.JPG
Счетчик вычисляется в цикле "FOR /F", который устанавливает, какие имена идентичны, следовательно, должны получить тот же префикс.
Но когда я пытаюсь добавить префикс счетчика, применяя следующую команду REN:
ren "%%h*" "!cnt!_%%h*"
У меня неприятности.
( %%h and !cnt! are variables of the "FOR /F" loop
)
Вот соответствующий вывод:
L083192 (1).jpg >> 1_L0831921).jpg [i.e. " (" gone missing]
[..]
L083192 (4).jpg >> 1_L0831924).jpg [id.]
Два файла "L081473" даже приводят кодинокийвыходной файл (без суффикса)!
16_L081473.JPG
Несомненно, существует связь с механизмами, описанными Дбенхэмом в егообширный пост о команде REN(AME), но я не могу разобраться с этим для случая выше, так как я ожидал бы, что исходные имена файлов будут усечены, а не какие-то промежуточные символы будут потеряны в процессе. Может быть, причина в пробеле в исходном имени файла, хотя я заключил эти имена файлов в кавычки в REN
команде, чтобы вместить пробелы? Может кто-нибудь объяснить?
Кроме того, поскольку, REN
похоже, не удается получить желаемый результат — или удается? — как я могу получить желаемый результат, используя простую партию?
Я также пытался обойти REN
проблему, используя COPY
или XCOPY
, но результаты идентичны. Эти команды, похоже, применяют одну и ту же схему — как осторожно предложил dbenhamв том же посте(см. примечание).
Пакетный файл
FOR /F %%h IN (input.txt) DO (
IF NOT "%%h" == "prev" (set /A cnt+=1)
[some more logic..]
cd Images
ren "%%h*" "!cnt!_%%h*"
cd..
[some more logic..]
set prev=%%h
)
Примечание:Я удалил из пакета дополнительную логику, которая, к примеру, позволяет избежать переименования файла более одного раза. "input.txt" содержит все вхождения только имени (т.е. без суффикса), что достаточно для вычисления префикса. Я мог бы предоставить пример файла, но не нашел, как связать его с этим сообщением. Кроме того, это не позволило бы повторить переименование (более того, папка "Images" занимает около 480 Мб).
Полные имена файлов в этой папке учитываются путем перехода в подкаталог "Images", где файлы ожидают переименования. ( REN
работает только в текущем каталоге)
решение1
Вы пропустили или не осознали значимость этого абзаца в моем посте RENAME:
Любое имя можно разбить на компоненты, разделенные
.
символами. Символы можно добавлять или удалять только в конце каждого компонента.Символы не могут быть удалены или добавлены в начало или середину компонента, сохраняя остаток с помощью подстановочных знаков.. Замены разрешены в любом месте.
Вы пытаетесь добавить символы в начало базового имени, сохраняя базовое имя с помощью подстановочного знака(ов). Согласно моему заявлению выше, это невозможно сделать. Вам придется переименовывать каждый файл по отдельности. Это не должно быть особенно сложно. Я предполагаю, что ваша другая логика верна:
FOR /F %%h IN (input.txt) DO (
IF NOT "%%h" == "prev" (set /A cnt+=1)
[some more logic..]
cd Images
for %%F in ("%%h*") do ren "%%F" "!cnt!_%%F"
cd..
[some more logic..]
set prev=%%h
)
Обратите внимание, что код даст сбой, если %%F
содержит !
из-за включенного отложенного расширения. Это можно решить, добавив немного кода. Лучше начать с отключенным отложенным расширением, а затем временно включить его по мере необходимости.
setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
endlocal
for %%F in ("%%h*") do ren "%%F" "%%N_%%F"
)