Lote. Massa renomeando arquivos na pasta e em todas as subpastas

0

Eu tento renomear todos os arquivos em pastas e sub-pastas, 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 eu 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 eu recebo são erros. Quando eu ecoo a última instrução do loop, isso me dá caminhos apropriados. O que estou perdendo?

    
por qpaycm 12.10.2015 / 02:48

1 resposta

1

Ao renomear um arquivo, você não pode incluir o caminho da pasta no nome do destino. Você pode usar %%~nxG para 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 de 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 os itens acima falharão 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, o valor será corrompido. Qualquer ! pode ser preservado, garantindo que a expansão atrasada seja desativada 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
)
    
por 12.10.2015 / 05:14