Usando o PowerShell para renomear arquivos com um número par em seu nome base

1

Eu tenho arquivos como este no diretório atual:

Agoraqueroadicionar2aonomebasedoarquivoquandoeleforumnúmeropar.Oquequerodizeréqueeugostariadeter:

000252.png→000254.png000254.png→000256.png000256.png→000258.png

Emoutraspalavras,esteéoresultadofinalquegostariadeter:

Como uso o PowerShell para implementar isso?

    
por yode 14.09.2018 / 21:35

2 respostas

5

Resposta curta

Assumindo que o diretório de trabalho contenha todos os arquivos para renomear (e somente esses arquivos), aqui está um forro para renomeá-los:

dir . | sort -des | % { if ($_.BaseName % 2 -eq 0 ) { mv $_ $((2 + $_.BaseName).ToString("000000") + $_.Extension) } }

Explicação

  • dir . lista os arquivos no diretório atual ( . ). dir é um alias para Get-ChildItem .
  • sort -des classifica esses arquivos em ordem decrescente ( -des ) de seu nome. sort é um alias para Sort-Object e -des é a abreviação de -Descending .
  • % é um alias para ForEach-Object que executa um script (incluído em chaves ( {} ) para cada item no pipeline.
  • if ($_.BaseName % 2 -eq 0 ) é usado para verificar se o nome base contém um número par usando o igualdade ( -eq ) e módulo ( % ) operadores.
  • mv é um alias para Move-Item , que pode ser usado para renomeie um arquivo.
  • $_ é o item atual que está em andamento.
  • (2 + $_.BaseName) extrai o nome base e adiciona 2.
  • .ToString("000000") formata este novo número com zeros à esquerda (supondo que você precise de um total de seis dígitos).
  • + $_.Extension adiciona o arquivo original extensão ( $_.Extension é o extensão do arquivo atual no pipeline e que inclui o . )

Observação

Esta solução renomearia um arquivo chamado 000998.png para 001000.png (em outras palavras, garante que há 6 dígitos no total).

    
por 17.09.2018 / 12:55
2
$files = "C:\files"

# for each file in the directory
# sort descending. this avoids trying to rename 252 -> 254 since 254 may exist.
gci $files | sort -des | % {
    $b = $_.BaseName                    # full basename, eg 000252
    $int = $b / 1                       # cast as an int, eg 252

    # if the integer is even
    if($int % 2 -eq 0) {

        # increase the name by 2
        $newBaseName = $b -replace $int,''
        $int = $int + 2

        # prepare the new basename
        $newBaseName = $newBaseName + [string]$int + $_.Extension

        # rename the files
        rename-item $files\$_ $files\$newBaseName -WhatIf
    }
}

Remova -WhatIf depois de verificar se isso funciona corretamente.

Você não especificou isso como um requisito, então eu não respondi, mas sei que um arquivo com o nome "000998.png" seria renomeado como "0001000.png", não "001000.png" .

    
por 14.09.2018 / 23:04