quinta-feira, 22 de maio de 2014

Batch rename usando PowerShell (atualização II)

Me fazia falta um meio de definir o número inicial a partir do qual os arquivos seriam nomeados sequencialmente.

Aproveitei para reformar o script e deixá-lo mais legível:

function nomes($id=1, $diretorio=$pwd) {
    $arquivos = @(Get-ChildItem $diretorio | Where-Object {!$_.PsIsContainer})
    $num_arquivos = $arquivos.Count
    $casas = $num_arquivos.ToString().Length

    if ($num_arquivos -eq 0) {Throw "Sem arquivos para renomear."}

    if ($id -ne 1) {
        $casas_tmp = ($id + $num_arquivos).ToString().Length
        if ($casas_tmp -ne $casas) {$casas = $casas_tmp}
    }

    $arquivos | ForEach-Object {
        $novo_nome = ($id++).ToString().PadLeft($casas) -replace ' ', '0'
        $novo_destino = Join-Path -Path $_.DirectoryName -ChildPath ($novo_nome + $_.extension.ToLower())
        Write-Host $_.FullName `> $novo_destino
        Move-Item -LiteralPath $_.FullName -Destination $novo_destino
    }
}

Então, por exemplo, nomes 3000 renomeará os arquivos da pasta atual iniciando no número 3000 e, caso a quantidade de arquivos esteja entre 6999 e 96999  (que fará o número passar a ter cinco algarismos), levará isso em conta e prefixará os nomes com zero corretamente. Idem com quantidades maiores. Sem fornecer parâmetro, inicia em 1. Ao chamá-lo indicando uma pasta, é obrigatório colocar o número inicial: nomes <número> C:\blabla.

Referências:
Batch rename usando PowerShell
Batch rename usando PowerShell (atualização)

Nenhum comentário:

Postar um comentário