Проблема при использовании RENAME для добавления префикса к группе файлов

Проблема при использовании RENAME для добавления префикса к группе файлов

Я столкнулся со следующей проблемой, пытаясь переименовать несколько сотен изображений в папке (это данность, на которую я не могу повлиять).

Все файлы имеют структуру "имя{пробел}суффикс.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"
)

Связанный контент