
Ich kann aufgrund von Bedingungen keine Liste (mit vielen) verschachtelten Ordnern zurückgeben und habe stundenlang viele verschiedene Methoden ausprobiert, indem ich online in Dokumentationen und auf Websites wie dieser gesucht habe.
Ich versuche es mit folgender Zeile:
gci -recur -dir | ? { !(gci $_ -file -recur -filter √.txt) -and (gci $_ -file -recur -filter *.mp3) } | select name
und erwartet die Rückgabe einer Liste von Ordnern, die die folgenden beiden Bedingungen erfüllen: enthält mindestens eine MP3-Datei als direktes untergeordnetes Element, jedoch keine Datei mit dem Namen „√.txt“ – als direktes untergeordnetes Element, d. h.:
-music
--artist
---album
----song1.mp3 würde lediglich den Verzeichnisnamen bzw. Pfad des Albums zurückgeben, wohingegen:
-music
--artist
---album
----√.txt
----song1.mp3
übersprungen und für etwa 10.000 unterschiedlich verschachtelte Alben wiederholt würde.
Noch einfacher: Ich erwarte, dass der folgende Code eine Liste von Unterverzeichnissen zurückgibt, die (als direkte untergeordnete Verzeichnisse) eine oder mehrere MP3-Dateien enthalten, aber das tut er nicht:
gci -recur -dir | ? { (gci $_ -file -recur -filter *.mp3) } | select name
Es gibt nur die direkten untergeordneten Elemente (das sind Kategorieordner wie „Rock“ oder „Jazz“) des aktuellen Verzeichnisses zurück, trotz des Aufrufs von -recur.
Ich möchte, dass Folgendes passiert: Ich durchsuche einen Ordner „Musik“, der viele tausend verschachtelte Unterverzeichnisse hat, und erhalte eine Liste der Unterverzeichnisse (unabhängig von der Verschachtelung), die gleichzeitig (als direkte untergeordnete Verzeichnisse) MP3s enthalten, aber nicht „√.txt“ (als direktes untergeordnetes Verzeichnis).
Hoffentlich ist das verständlich genug! Sagen Sie mir Bescheid, wenn Sie weitere Informationen oder Klarstellungen benötigen.
Hier ist ein Ausschnitt der Ordnerstruktur:
Verzeichnis: D:\Musik\Rock\90er\Stereolab\Alben:
1992 - Peng!
1992 - Switched On
1994 - Mars Audiac Quintet
Danke schön!
Antwort1
Es gibt keine Möglichkeit, dies mit nur einem Befehl zu tun. Sie würden eine Liste aller Ordner erstellen, die mindestens eine MP3-Datei enthalten, und dann eine zweite Schleife nur mit dieser Liste ausführen und prüfen, ob dieser Ordner Ihre Datei enthält. Wenn ja, entfernen Sie diesen Eintrag aus der Liste.
Hier ist ein Beispielskript dazu:
$targetFolder = "C:\Test"
# Step 1: Scan the target folder and its subfolders for MP3 files
$mp3Files = Get-ChildItem -Path $targetFolder -Filter "*.mp3" -Recurse `
| Select-Object -ExpandProperty Directory | Get-Unique
# Step 2: Filter the list to exclude folders containing 'v.txt'
$filteredFolders = $mp3Files | Where-Object {
$vTxtFile = Get-ChildItem -Path $_ -Filter "v.txt" -File `
-ErrorAction SilentlyContinue
-not $vTxtFile
}
# Step 3: Output the resulting folders
$filteredFolders