Arquivo de lote do Windows para substituir String no nome do arquivo

3

Estou tentando renomear em lote arquivos em uma pasta contendo arquivos no seguinte padrão de nome:

xxxtemplatexxxxx.xlsx

Um exemplo do nome que eu tenho é:

IDA_template - differentwordingshere.xlsx

Os x podem não ser o mesmo. Quero substituir o template pela data, por exemplo, 201307.

Eu tentei

ren *template* *201307*

Mas ele anexou 201307 ao final.

Na bash eu provavelmente poderia fazer

rename template 201307 *.xlsx

mas infelizmente isso será no Windows.

O arquivo

.bat será colocado na mesma pasta onde estão os arquivos.

    
por csg 28.07.2013 / 05:12

3 respostas

3
@echo off
setlocal enabledelayedexpansion

for %%F in (*template*) do (
    set name=%%~nxF
    set name=!name:template=%date:~-4%%date:~-10,2%!
    rename "%%~fF" "!name!"
)

exit /B 0
    
por 28.07.2013 / 18:40
2

O Windows RENAME é bastante limitado com o que pode fazer com curingas. Isso não ajudará em seu problema atual, mas você pode ver o que é possível em Como o comando Windows RENAME interpreta curingas?

Eu escrevi um utilitário híbrido JScript / batch chamado REPL.BAT que executa uma pesquisa regex e substitui stdin e grava o resultado em stdout. O utilitário é um script nativo puro que funciona em qualquer versão do Windows a partir do XP. Nenhum download exe é necessário.

O REPL.BAT está disponível aqui. A documentação completa está incorporada no script.

Continuo espantado com a utilidade do REPL.BAT. Pode resolver facilmente o seu problema atual.

Assumindo que o REPL.BAT está em seu diretório atual, ou melhor ainda, em algum lugar em seu PATH, o seguinte liner moderadamente complexo funcionará a partir da linha de comando:

for /f "tokens=1* delims=?" %A in ('dir /b *TEMPLATE*^|repl "(.*)TEMPLATE(.*)" "$&?$1201307$2" I') do @ren "%A" "%B"

Ou como um script em lote mais fácil de ler:

@echo off
for /f "tokens=1* delims=?" %%A in (
  'dir /b *TEMPLATE*^|repl "(.*)TEMPLATE(.*)" "$&?$1201307$2" I'
) do ren "%%A" "%%B"

Eu canalizo os nomes dos arquivos correspondentes para REPL.BAT para modificar cada nome no nome original, um delimitador ? e, em seguida, o novo nome. Eu escolhi ? como um delimitador porque ele não pode aparecer em um nome de arquivo. O comando FOR / F analisa os resultados e executa um comando REN para cada arquivo.

Os itens acima podem ser facilmente modificados para renomear recursivamente todos os arquivos correspondentes na hierarquia de pastas:

@echo off
for /f "tokens=1* delims=?" %%A in (
  'dir /b /s *TEMPLATE*^|repl ".*\(.*)TEMPLATE(.*)" "$&?$1201307$2" I'
) do ren "%%A" "%%B"

Finalmente, pode ser bom estabelecer a data dinamicamente, mas trabalhar com data e hora em lote geralmente é uma dor real devido a diferenças de localidade.

Outro utilitário JScript / batch híbrido útil chamado GETTIMESTAMP.BAT fornece computação e formatação de timestamp robustas. Pode criar um timestamp em praticamente qualquer formato desejado. A data / hora pode ser especificada ou pode ser obtida a partir do relógio do sistema. Ele fornece compensações de data e hora, bem como especificadores de fuso horário para entrada e saída.

GETTIMESTAMP.BAT está disponível aqui. . O utilitário está na parte inferior do post. A documentação extensa está incorporada no script.

Com GETTIMESTAMP.BAT no PATH, agora é trivial estender o código acima para estabelecer dinamicamente a string de data. Esta é a versão da pasta recursiva:

@echo off
setlocal
call getTimestamp -f {yyyy}{mm} -r dt
for /f "tokens=1* delims=?" %%A in (
  'dir /b /s *TEMPLATE*^|repl ".*\(.*)TEMPLATE(.*)" "$&?$1%dt%$2" I'
) do ren "%%A" "%%B"
    
por 28.07.2013 / 07:13
1

Se você instalar o PowerShell , poderá usar algo como:

get-childitem *.xlsx | foreach { rename-item $_ $_.Name.Replace("template", (Get-Date -format "yyyyMM")) }

Isso renomeará todos os arquivos XLSX na pasta atual, substituindo instâncias da palavra "modelo" no nome do arquivo pelo ano e mês atuais.

    
por 28.07.2013 / 05:30