PowerShell を使用して、特定のファイルを含む、または含まないネストされたサブディレクトリをすべて選択します。

PowerShell を使用して、特定のファイルを含む、または含まないネストされたサブディレクトリをすべて選択します。

条件に基づいて(多数の)ネストされたフォルダーのリストを返すことができず、ドキュメントやこのサイトなどのサイトでオンライン検索して、さまざまな方法を何時間も試してきました。

次の行を試しています:

gci -recur -dir | ? { !(gci $_ -file -recur -filter √.txt) -and (gci $_ -file -recur -filter *.mp3) } | select name

そして、次の 2 つの条件を満たすフォルダーのリストを返すことを期待しています: 直接の子として少なくとも 1 つの .mp3 ファイルが含まれていますが、直接の子として "√.txt" という名前のファイルは含まれていません。つまり、

-music
--artist
---album
----song1.mp3 はアルバム ディレクトリ名またはパスのみを返しますが、
-music
--artist
---album
----√.txt
----song1.mp3
はスキップされ、約 1 万個のさまざまなネストされたアルバムが繰り返されます。

さらに簡単に言うと、次のコードは、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

1 つのコマンドだけで実行する方法はありません。 少なくとも 1 つの mp3 を含むすべてのフォルダーのリストを作成し、そのリストのみを使用して 2 回目のループを実行し、そのフォルダーにファイルが含まれているかどうかを確認します。含まれている場合は、リストからそのエントリを削除します。

これがどのようなものであるかを示すスクリプトの例を次に示します。

$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

関連情報