PowerShell: Array von Arrays

PowerShell: Array von Arrays

Ich habe Dateien mit folgender Struktur:

c:\root\dir1\001 (BRP-01 Some) Text.tif
c:\root\dir2\002 (BRP-01 Some Different) Text.tif
c:\root\dir3\001 (BRP-01 Some) Text.tif
...

Letztendlich möchte ich Dateien basierend auf einem zusammenhängenden Bereich der ersten drei Ziffern eines Dateinamens extrahieren. Mein erster Ansatz besteht darin, zu versuchen, Array of ArraysVerzeichnisinformationen und Dateiinformationen zu speichern ..., die dann anschließend verwendet werden, um die ersten drei Zahlen zu extrahieren, auszuwerten und weiter zu bearbeiten. Meine Erfahrung mit Arrays in PS ist jedoch begrenzt und ich habe Probleme beim Speichern von Daten, beim Zugriff auf diese Daten oder bei beidem.

Ich wäre Ihnen dankbar, wenn Sie mir helfen könnten, meine Syntax zu korrigieren. Wenn es einen besseren Ansatz gibt, den ich in Betracht ziehen könnte, bin ich auch für alternative Ansätze offen.

PS C:\root\> Get-ChildItem *.tif -recurse | foreach-object {$a=$_.DirectoryName; $b=$_.Name; $c+=@(@($a,$b)); foreach ($i in $c) {echo $i[0]}
# I realize something "breaks" after $c+= ... but I am unsure what. The script runs but I cannot access the respective fields as expected or the data isn't being populated as expected.

Ich würde erwarten, dass das Array etwa Folgendes zurückgibt, sobald ich die richtige Syntax habe:

$i[0]: 
       c:\root\dir1\
       c:\root\dir2\
       c:\root\dir3\
$i[1]: 
       001 (BRP-01 Some) Text.tif
       002 (BRP-01 Some Different) Text.tif
       001 (BRP-01 Some) Text.tif
$i[0][1]: c:\root\dir1\

Ich bin ziemlich zuversichtlich, dass ich die Daten manipulieren kann, sobald ich genau verstanden habe, wie sie Array of Arraysaufgebaut sind und wie die Daten daraus abgerufen werden.

Danke!

Antwort1

Ich denke, Sie machen das viel zu kompliziert. Sie brauchen keine weitere „Datenformatierung“, nachdem Sie Ihren Get-ChildItemBefehl ausgeführt haben. Sie müssen Group-ObjectIhre Ausgabe einfach von den ersten 3 Zeichen der Dateinamen abhängig machen, wie folgt:

$AllItemsGrouped = Get-ChildItem *.tif -recurse | Group-Object { $_.Name.Substring(0,3) }

Dadurch werden Ihre Objekte gruppiert nach ihren jeweiligen Präfixen zurückgegeben, ohne dass Informationen verloren gehen:

PS C:\Install\testdir500> gci | group-object { $_.Name.substring(0,3) }

Count Name                      Group
----- ----                      -----
    3 001                       {001test - Kopie (2).txt, 001test - Kopie.txt, 001test.txt}
    2 002                       {002test - Kopie.txt, 002test.txt}
    1 003                       {003test - Kopie - Kopie.txt}

Wenn Sie beispielsweise eine Gruppe erweitern, sieht der Inhalt folgendermaßen aus:

PS C:\Install\testdir500> gci | group-object { $_.Name.substring(0,3) } | select -expand Group -first 1


    Verzeichnis: C:\Install\testdir500


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       30.11.2020     09:55              0 001test - Kopie (2).txt
-a----       30.11.2020     09:55              0 001test - Kopie.txt
-a----       30.11.2020     09:55              0 001test.txt

Darauf kannst du dann auf verschiedenen Wegen zugreifen, zum Beispiel so:

foreach ($Group in $AllItemsGrouped) {

    $CurrentGroup = $Group.Group
    Do-Something -With $CurrentGroup

}

verwandte Informationen