
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 Arrays
Verzeichnisinformationen 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 Arrays
aufgebaut 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-ChildItem
Befehl ausgeführt haben. Sie müssen Group-Object
Ihre 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
}