使用 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,000 个嵌套的不同专辑。

更简单地说,我希望下面的代码返回包含(作为直接子项)一个或多个 .mp3 文件的子目录列表,但事实并非如此:

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

尽管调用了 -recur,它仅返回当前目录的直接子目录(即“摇滚”或“爵士”等类别文件夹)。

我希望发生的是,我搜索一个包含数千个嵌套子目录的文件夹“音乐”,并返回子目录列表(无论如何嵌套),这些子目录同时包含(作为直接子目录)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

相关内容