Analisar e alternar elementos de nomes de pastas usando o Powershell

0

Eu tenho tentado escrever um script PowerShell (meu primeiro) para

  1. analisa apenas as pastas dentro de um diretório
  2. selecione apenas as pastas que correspondem a uma convenção de nomenclatura específica ('SEASON YEAR')
  3. alterna a ordem dos elementos do nome ('YEAR SEASON')

Eu eventualmente usei o programa BulkRenameUtility para fazer isso usando o regexp ^ (\ w +) (\ d +) e alterando a ordem do token para $ 2 $ 1 - no entanto, eu ainda estou aprendendo o Powershell e gostaria de poder fazer isso sem usar um programa externo.

Então, para reiterar, em C: \ Users \ Test

existem pastas e arquivos. Algumas das pastas são nomeadas Spring 2015 , Fall 2014 , por exemplo. No entanto, outras pastas têm nomes como geogex . Os arquivos têm nomes como ENG1A SPRING 2015.odt e untitled_0.odt .

Como faço para alterar apenas os nomes das pastas nomeadas como "Primavera de 2015" para "Primavera 2015", "Queda 2014" etc.?

Eu consegui usar

 gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' 

para realizar 1 e 2, mas estou preso ao usar isso para fazer a parte 3: realmente renomeie invertendo os elementos do nome. Eu tentei colocar o acima dentro de uma variável e assim:

gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' | %{$data = $_.line; Write-Output "$data"};

no entanto, enquanto o acima mostra exatamente as pastas que eu quero, a matriz $ data parece conter apenas a última linha de saída. Tal que:

gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' | %{$data = $_.line; Write-Output "$data"};
$data 

produzirá:

test 123
test 321
test 321

Não tenho certeza se essa é mesmo a direção válida para começar.

Qualquer ajuda seria muito apreciada.

    
por Poshed 07.07.2015 / 13:37

1 resposta

0

Em vez de Select-String , use as propriedades do objeto:

# Path to folder
$Path =  '.\'

# Regex to match 'SEASON YEAR' and extract capture groups
$Regex = '^(\w+)\s(\d+)'

# Get all objects in path
Get-ChildItem -Path $Path |
    # Select only objects that are directory and name matches regex
    Where-Object {$_.PSIsContainer -and $_.Name -match $Regex} |
        # For each such object
        ForEach-Object {
            # Generate new name
            $NewName = $_.Name -replace ($Regex, '$2 $1')

            # Rename object
            Rename-Item -Path $_.FullName -NewName $NewName
        }
    
por 14.07.2015 / 17:29