Lote. Renomeação em massa de arquivos na pasta e em todas as subpastas

Lote. Renomeação em massa de arquivos na pasta e em todas as subpastas

Tento renomear todos os arquivos em pastas e subpastas removendo a parte "-min" de cada nome de arquivo com a ajuda de scripts em lote no win7

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
FOR /R %%A in (.*)-min.png DO REN "%%A-min.png" "%%A.png"

Parece que algo está errado aqui com o parâmetro SET, eu acho, então tento fazer assim:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
For /R %%G in (*-min.png) DO (
    SET "oldname=%%G"
    SET "newname=!oldname:~0,-8!.png"
    REN "!oldname!" "!newname!"
)

mas tudo que recebo são erros. Quando eu ecoo a última instrução do loop, isso me fornece caminhos adequados. o que estou perdendo?

Responder1

Ao renomear um arquivo, você não pode incluir o caminho da pasta no nome de destino. Você pode usar %%~nxGpara obter o nome e a extensão do arquivo sem o caminho. Você não precisa da variável oldname - você pode simplesmente usar %%G. Você pode eliminar uma linha e fazer a manipulação da string diretamente na instrução REN.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
For /R %%G in (*-min.png) DO (
    SET "newname=%%~nxG"
    REN "%%G" "!newname:~0,-8!.png"
)

Observe que o procedimento acima falhará se qualquer parte do caminho do arquivo incluir o !caractere porque a expansão da variável FOR ocorre antes da expansão atrasada, portanto, corromperá o valor. Qualquer um !pode ser preservado certificando-se de que a expansão atrasada esteja desabilitada quando a variável FOR for expandida. Isso requer ativar e desativar a expansão atrasada dentro do loop.

@echo off
setlocal disableDelayedExpansion
cd F:\Mega.Pack-128x128\textures\
for /r %%G in (*-min.png) do (
  set "oldpath=%%G"
  set "newname=%%~nxG"
  setlocal enableDelayedExpansion
  ren "!oldpath!" "!newname:~0,-8!.png"
  endlocal
)

informação relacionada