используйте powershell для выбора всех вложенных подкаталогов, которые как содержат, так и не содержат определенный файл

используйте powershell для выбора всех вложенных подкаталогов, которые как содержат, так и не содержат определенный файл

Я не могу вернуть список (множества) вложенных папок на основе условных выражений и часами пробовал разные методы поиска в документации и на таких сайтах, как этот.

Я пробую следующую строку:

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

Связанный контент