Analysieren und wechseln Sie Elemente von Ordnernamen mit Powershell

0

Ich habe versucht, ein Powershell-Skript (mein erstes) zu schreiben

  1. Analysieren Sie nur die Ordner in einem Verzeichnis
  2. Wählen Sie nur die Ordner aus, die einer bestimmten Namenskonvention entsprechen ("JAHRESZEIT").
  3. ändere die Reihenfolge der Elemente des Namens ('JAHRESZEIT')

Ich habe schließlich das Programm BulkRenameUtility verwendet, um dies mit dem regulären Ausdruck ^ (\ w +) (\ d +) zu tun und die Token-Reihenfolge auf $ 2 $ 1 zu ändern. Ich lerne jedoch immer noch Powershell und möchte dies auch ohne ein tun können externes Programm.

Um es noch einmal zu wiederholen, gehen Sie zu C: \ Users \ Test

gibt es Ordner und Dateien .. sind einige der Ordner mit den Namen Spring 2015, Fall 2014zum Beispiel. Andere Ordner haben jedoch Namen wie geogex. Dateien haben Namen wie ENG1A SPRING 2015.odtund untitled_0.odt.

Wie ändere ich nur die Namen der Ordner mit dem Namen "Frühling 2015" in "Frühling 2015", "Herbst 2014" usw.?

Ich konnte verwenden

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

Um 1 und 2 zu erreichen, bleibe ich aber dabei, Teil 3 zu machen: Benenne tatsächlich um, indem du die Elemente des Namens umkehrst. Ich habe versucht, das Obige in eine Variable zu setzen, und zwar wie folgt:

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

Während die obigen Ausgaben genau die Ordner sind, die ich möchte, scheint das Array $ data nur die letzte Ausgabezeile zu enthalten. So dass:

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

wird ausgeben:

test 123
test 321
test 321

Ich bin mir nicht sicher, ob dies überhaupt eine gültige Richtung ist.

Jede Hilfe wäre sehr dankbar.

Poshed
quelle

Antworten:

0

Select-StringVerwenden Sie stattdessen die Eigenschaften des Objekts:

# 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
        }
Beatcracker
quelle