@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
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.
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"
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.
Tags command-line windows batch