¿Utiliza el cambio de nombre de Windows para reemplazar un guión bajo simple por uno doble?

¿Utiliza el cambio de nombre de Windows para reemplazar un guión bajo simple por uno doble?

¿Alguien puede aconsejarme en qué me estoy equivocando con esto? Tengo algunos nombres de archivos que contienen XXX XXX_Layer_XXXy estoy intentando reemplazarlos porXXX XXX_Layer__XXX

Mi intento hasta ahora fue:

ren  "*Layer_*.*"  "*Layer__*.*"

¡Pero eso no parece estar funcionando como se esperaba!

Respuesta1

Mi respuesta anterior intentó usar el rencomando y falló, porque este comando solo hace una coincidencia de cadenas muy primitiva. Lo más importante es que no puede reemplazar una cuerda por una más larga.

Para evitar que otros cometan el mismo error, aquí tienes una explicación (no una respuesta).

Si el comando se escribe como:

ren SourceMask TargetMask

entonces cualquier carácter TargetMaskhace que el puntero SourceMaskavance una posición.

Entonces, si cambiamos el nombre del archivo 1234.567con el siguiente comando:

ren *2*.* *2X*.*

el resultado será 12X4.567. Va anoser el ingenuamente esperado 12X34.567.

La razón es que TargetMaskaquí se maneja así:

*2 - matches up to and including 2, adding to target : 12
X - matches itself AND advances one position so skipping 3, adding to target : X
*. - matches up to and including the point, adding to target : 4.
* - matches the extension part, adding to target : 567

Conclusión: rense debe evitar el comando al reemplazar cadenas de longitudes desiguales.

El renfuncionamiento está descrito de forma muy completa en el post.
¿Cómo interpreta el comando RENAME de Windows los comodines?.

Respuesta2

Debería ser mucho más fácil en PowerShell

Get-ChildItem *Layer_* | Rename-Item -NewName { $_.Name -creplace '_Layer_', '_Layer__' } -WhatIf

Versión con alias:

ls *Layer_* | ren -Ne { $_.Name -creplace '_Layer_', '_Layer__' } -wi

Después de confirmar que los nuevos nombres son correctos, simplemente elimine -WhatIf/ -wipara hacer un cambio de nombre real

En cmd, el renamecomando realiza un reemplazo codicioso en el objetivo si ve un error, *por lo que su solución no funcionará. Ver¿Cómo interpreta el comando RENAME de Windows los comodines?. Tendrás que reemplazar la cuerda tú mismo. Algo como esto

@echo off
setlocal enabledelayedexpansion

for %%d in (*_Layer_*) do (
    set "name=%%d"
    echo ren "!name!" "!name:_Layer_=_Layer__!"
)

El reemplazo es esta pieza !name:_Layer_=_Layer__!. La sintaxis es%variablename:text_to_find=text_to_replace%

información relacionada