Batch renomeia pastas?

0

Esta é provavelmente uma tarefa super simples já resolvida, mas:

Eu tenho uma série de pastas contendo eBooks em vários formatos. Eles têm o formato do nome da pasta:

\Lastname, Firstname (n books)\

Eu quero renomear cada uma das pastas para ser simplesmente

\Firstname Lastname\

que eu estou supondo que pode ser feito com um arquivo em lote com bastante facilidade, mas tem sido um tempo muito longo desde que eu tive que fazer análise de seqüência de caracteres, então eu não tenho nenhuma lembrança de como.

Ajuda? Estou usando o Windows 7.

    
por Margaret 12.04.2012 / 07:04

1 resposta

3

Supondo que os espaços sejam consistentes com o seu exemplo (ou seja, o nome e o sobrenome não têm espaços), isso deve funcionar.

@echo off

setlocal EnableDelayedExpansion

for /f "tokens=1,2,*" %%a in ('dir /a:d /b') do (
    set lastname=%%a
    set lastname=!lastname:~0,-1!
    ren "%%a %%b %%c" "%%b !lastname!"
)

endlocal

Ele apenas divide por espaços e apara a vírgula do Sobrenome, de todos os diretórios no mesmo diretório que o arquivo em lotes.

Se os nomes podem ter espaços, alguma manipulação do delimitador é necessária. Eu vou mexer com isso.

Editar:

Aqui vamos nós. Lidar com delimitadores significa que o nome estava cercado por um espaço antes e depois dele, que precisava ser aparado. Então, basicamente, ele espera um Lastname seguido por um , seguido por um Firstname seguido por um (whatever . Os espaços ao redor do Firstname são importantes (e estão no seu exemplo). Espaços dentro dos nomes funcionam bem.

@echo off

setlocal EnableDelayedExpansion

for /f "tokens=1,2,* delims=,(" %%a in ('dir /a:d /b') do (
    set firstname=%%b
    set firstname=!firstname:~1,-1!
    ren "%%a,%%b(%%c" "!firstname! %%a"
)

endlocal

Você pode querer ter um teste, colocando um echo antes do ren , para garantir que ele funcione como esperado.

    
por 12.04.2012 / 07:31