É bastante comum que os nomes tenham mais de duas partes. Normalmente, há apenas um sobrenome, mas o sobrenome pode ter um hífen incorporado. Pode haver 2 ou mais nomes antes do sobrenome.
Também não é irracional esperar que um título tenha um hífen.
Assim, seu analisador precisa ser capaz de se diferenciar corretamente. Expressões regulares seriam úteis, mas os arquivos em lote nativos do Windows não têm um bom suporte para regex.
Uma solução em lote provavelmente envolve um loop FOR e uma expansão atrasada. Mas as variáveis FOR serão corrompidas quando expandidas se contiverem !
quando a expansão atrasada estiver ativada e !
poderá aparecer no título. A expansão atrasada pode ser ativada e desativada conforme necessário no loop.
Os itens a seguir lidam apropriadamente com um nome como "Alguns títulos! - 2ª parte do título - Nome1 Nome2 Sobrenome1-Surname2.mobi"
e renomeie para
Sobrenome1-Sobrenome2 Nome1 Nome2 - Some title! - 2ª parte do título.mobi "
@echo off
setlocal disableDelayedExpansion
for /f "delims=" %%F in ('dir /b /a-d "* - * *.mobi"') do (
%== Change to root folder so path of current directory is empty ==%
pushd \
%== Separate fileName from extension ==%
set "fileName=%%~nF"
set "ext=%%~xF"
%== Separate Title from full name. Assume everything before final " - " is Title ==%
setlocal enableDelayedExpansion
for /f "delims=" %%A in ("!fileName: - =\!") do (
endlocal
set "name=%%~nxA"
set "title=%%~pA"
)
%== Separate Surname from Name. Assume Surname is after final space ==%
setlocal enableDelayedExpansion
for /f "delims=" %%A in ("!name: =\!") do (
endlocal
set "surname=%%~nxA"
set "name=%%~pA"
)
%== Strip leading and trailing \ from name and title ==%
setlocal enableDelayedExpansion
set "name=!name:~1,-1!"
set "title=!title:~1,-1!"
%== Rename file, restoring spaces in Name and " - " in Title ==%
ren "!fileName!!ext!" "!surname! !name:\= ! - !title:\= - !!ext!"
endlocal
popd
)
A vida é muito mais fácil com uma ferramenta de regex decente. Eu escrevi um utilitário híbrido JScrip / batch chamado REPL.BAT que executa uma pesquisa em regex e substitui stdin e grava o resultado para stdout. É um script puro que será executado em qualquer máquina Windows do XP em diante. A documentação completa está incorporada no script.
Usando o REPL.BAT, a solução se torna:
@echo off
for /f "delims=" %%A in (
'dir /b /a-d "* - * *.mobi" ^| repl "(.*) - (.*) (.*)(\.mobi)$" "ren \q$&\q \q$3 $2 - $1$4\q" x'
) do %%A
Observe que você não pode executar nenhum dos scripts mais de uma vez sem corromper os nomes dos arquivos. Pode ser mais seguro mover os arquivos para um novo local quando você os renomeia. O comando MOVE pode renomear e mover em uma única etapa.