Get-ChildItem:仅显示不包含特定文件的文件夹

Get-ChildItem: Show only folders that do not include a specific file

平台第一post ;-)

场景:我有一个根文件夹,其中包含带有设置相关文件的子文件夹。一些子文件夹包含更多子文件夹和更多文件、子子文件夹。根文件夹下的每个子文件夹或其子文件夹必须包含一个特定文件。

现在我想获取直接位于根文件夹下但不包含此特定文件的所有子文件夹,既不在子文件夹本身中,也不在下面的其他子文件夹中。我只想要根目录下的子文件夹的名称。当然,搜索应该是递归的。

我当前的代码如下所示:

Get-ChildItem $softwarePath -Recurse | ? Name -notlike "Prefix_*.cmd"

不幸的是,结果非常大,它也包括每个子文件夹中的所有文件。我的愿望:只获取根目录下的子文件夹的名称来检查,没有特定文件。

欢迎使用 Whosebug!

你快到了。这是一个解决方案,我首先检索 $softwarePath 的所有子文件夹,然后 select 仅检索不包含文件的子文件夹:

Get-ChildItem $softwarePath -Directory | 
? { -not (Get-ChildItem $_.FullName -Recurse -File -Filter 'Prefix_*.cmd')}

虽然 @jisaak 的方法完美地解决了您的问题,但您可能会发现为 巨大的 目录结构中的每个文件检索 FileInfo 对象的开销可能会导致脚本需要一些时间来执行。

如果是这种情况,您可以使用 Directory.GetFiles() 方法仅检索文件名来加快处理速度:

Get-ChildItem $softwarePath -Directory |Where-Object { 
    -not ([System.IO.Directory]::GetFiles($_.FullName,'Prefix_*.cmd',"AllDirectories"))
}