script em lote para trocar palavras / renomear arquivos

1

alguém poderia me ajudar por favor? Eu ganhei xp e monte de e-books com o seguinte nome:

Título - Nome Sobrenome.mobi e eu preciso de um arquivo BAT para obter: Sobrenome - Title.mobi

Eu sou quase capaz de trocar o que é antes e depois do traço (exceto resolver espaços em branco ainda). Mas eu não tenho idéia de como trocar o nome e sobrenome. Cheguei até aqui, mas é apenas a primeira troca. talvez alguma expressão regular seria legal .. obrigada, xcooba

echo off FOR / f "fichas = 1,2,3 delims = -." %% G IN ('dir / b') faz ren "%% G - %% H. %% I" "%% H - %% G. %% I"
pausar

    
por xcooba 22.06.2014 / 14:27

1 resposta

0

É 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.

    
por 22.06.2014 / 16:55