
Я не могу вернуть список (множества) вложенных папок на основе условных выражений и часами пробовал разные методы поиска в документации и на таких сайтах, как этот.
Я пробую следующую строку:
gci -recur -dir | ? { !(gci $_ -file -recur -filter √.txt) -and (gci $_ -file -recur -filter *.mp3) } | select name
и ожидая возврата списка папок, которые соответствуют следующим двум условиям: содержат по крайней мере один файл .mp3 в качестве прямого дочернего элемента, но не содержат файл с именем «√.txt» — в качестве прямого дочернего элемента, т. е.:
-music
--artist
---album
----song1.mp3 вернет только имя каталога альбома или путь, тогда как:
-music
--artist
---album
----√.txt
----song1.mp3
будет пропущено и повторено для примерно 10 тысяч альбомов с различной степенью вложенности.
Еще проще, я ожидаю, что следующий код вернет список подкаталогов, которые содержат (в качестве прямых потомков) 1 или более файлов .mp3, но этого не происходит:
gci -recur -dir | ? { (gci $_ -file -recur -filter *.mp3) } | select name
Он возвращает только прямые дочерние элементы (папки категорий, такие как «рок» или «джаз») текущего каталога, несмотря на вызов -recur.
Мне бы хотелось выполнить поиск в папке «music», которая содержит тысячи вложенных подкаталогов, и вернуть список подкаталогов (независимо от степени вложенности), которые одновременно содержат (как прямые дочерние элементы) файлы mp3, но не содержат «√.txt» (как прямой дочерний элемент).
Надеюсь, это достаточно понятно! Дайте мне знать, если понадобится больше информации или ясности.
Вот фрагмент структуры папок:
Каталог: D:\music\rock\90s\Stereolab\albums:
1992 - Peng!
1992 - Switched On
1994 - Mars Audiac Quintet
Спасибо!
решение1
Нет способа сделать это одной командой. Что бы вы сделали, так это создали список всех папок, которые содержат хотя бы один mp3, а затем сделали бы второй цикл только с этим списком и посмотрели, содержит ли эта папка ваш файл. Если да, удалите эту запись из списка.
Вот пример сценария того, что это может быть:
$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