Problema al usar RENAME para agregar un prefijo a varios archivos

Problema al usar RENAME para agregar un prefijo a varios archivos

Me encontré con el siguiente problema al intentar cambiar el nombre de varios cientos de imágenes en una carpeta (lo cual es un hecho, no puedo influir en ello).

Todos los archivos tienen la estructura "nombre{espacio}sufijo.JPG".
Entonces las imágenes pueden tener el mismonombre, pero en ese caso se distinguen por susufijo. P.ej

L083192 (1).JPG  
L083192 (2).JPG  
L083192 (3).JPG  
L083192 (4).JPG

o

L081473 a.JPG  
L081473 b.JPG

El objetivo es añadir un contador (como prefijo) a todas las imágenes con el mismo nombre. Es decir

1_L083192 (1).JPG  
1_L083192 (2).JPG  
1_L083192 (3).JPG  
1_L083192 (4).JPG

[..]

16_L081473 a.JPG  
16_L081473 b.JPG

El contador se calcula en un bucle "FOR/F" que establece qué nombres son idénticos, por lo que deberían obtener el mismo prefijo.
Pero cuando intento agregar el contraprefijo aplicando el siguiente comando REN:

ren "%%h*" "!cnt!_%%h*"

Me meto en problemas.
( %%h and !cnt! are variables of the "FOR /F" loop)

Esta es la salida correspondiente:

L083192 (1).jpg >> 1_L0831921).jpg        [i.e. " (" gone missing]  
[..]  
L083192 (4).jpg >> 1_L0831924).jpg        [id.]

Los dos archivos "L081473" incluso dan como resultado unsolteroarchivo de salida (sin sufijo)!

16_L081473.JPG

Sin duda existe un vínculo con los mecanismos descritos por dbenham en supublicación extensa sobre el comando REN(AME), pero no puedo resolverlo para el caso anterior, ya que esperaría que los nombres de los archivos originales se truncaran, en lugar de que se pierdan algunos caracteres intermedios en el proceso. Tal vez el espacio en el nombre del archivo original sea la razón, aunque cité estos nombres de archivo en el RENcomando para acomodar espacios. ¿Alguien puede explicarlo?

Además, como RENparece que no puedo producir el resultado buscado (¿o sí?), ¿cómo puedo obtener el resultado deseado utilizando un lote simple?

También intenté solucionar el RENproblema usando COPYo XCOPY, pero los resultados son idénticos. Estos comandos parecen aplicar el mismo esquema, como sugiere cuidadosamente dbenhamen la misma publicacion(ver la nota).


Archivo por lotes

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
)

Nota:Le quité al lote su lógica adicional, lo que también evita que se cambie el nombre de un archivo más de una vez. El "input.txt" contiene todas las apariciones del nombre únicamente (es decir, sin sufijo), lo cual es suficiente para calcular el prefijo. Podría proporcionar un archivo de muestra, pero no encontré cómo vincularlo a este mensaje. Además, eso no permitiría replicar el cambio de nombre (además, la carpeta "Imágenes" mide aproximadamente 480 Mb).
Los nombres completos de los archivos en esta carpeta se tienen en cuenta cambiando al subdirectorio "Imágenes", donde los archivos esperan ser renombrados. ( RENfunciona sólo en el directorio actual)

Respuesta1

Te perdiste o no te diste cuenta del significado de este párrafo en mi publicación RENAME:

Cualquier nombre se puede dividir en componentes delimitados por . Caracteres que solo se pueden agregar o eliminar al final de cada componente.No se pueden eliminar ni agregar caracteres al principio o a la mitad de un componente mientras se conserva el resto con comodines.. Se permiten sustituciones en cualquier lugar.

Está intentando agregar caracteres al principio del nombre base, conservando el nombre base con un comodín. Según mi declaración anterior, esto no se puede hacer. Tendrás que cambiar el nombre de cada archivo individualmente. Esto no debería ser particularmente difícil. Supongo que tu otra lógica es correcta:

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
)

Tenga en cuenta que el código fallará si %%Fcontiene !debido a que se ha habilitado la expansión retrasada. Eso se puede solucionar con un poco más de código. Es mejor comenzar con la expansión retrasada deshabilitada y luego habilitarla temporalmente según sea necesario.

setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
  endlocal
  for %%F in ("%%h*") do ren "%%F" "%%N_%%F"
)

información relacionada