Batch rename usando PowerShell

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
    }
}

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.

Comentários