如何获取某些仅包含文件而没有其他子文件夹的子文件夹的名称?

How do I get the names of certain subfolders that only contain files and no other subfolders?

从一个包含多个子文件夹的文件夹中,我只想将子文件夹名称(没有路径)保存到一个只包含文件而没有更多子文件夹的文本文件中。

示例:只有位于 C: 的子文件夹“Test”包含文件,但没有其他子文件夹。该脚本应检测到这一点并将文件夹名称 Test 保存在文本文件中。如果有更多子文件夹,如“Test”,这些也应该保存在文本文件中。

包含子文件夹的主文件夹应该是与 .ps1 文件处于同一文件夹级别的文件夹。

我如何实现这一点?

首先查找当前路径中的所有文件夹和子文件夹(递归):

Get-ChildItem -LiteralPath $PSScriptRoot -Directory -Recurse

然后根据每个目录本身是否包含0个子文件夹和超过0个文件进行过滤:

Get-ChildItem -LiteralPath $PSScriptRoot -Directory -Recurse |Where-Object {
  -not($_ |Get-ChildItem -Directory |Select-Object -First 1) -and $($_ |Get-ChildItem -File -Filter *.txt |Select-Object -First 1)
}

如果$_ |Get-ChildItem -Directory |Select-Object -First 1 returns anything,则表示至少有1个子文件夹。

类似地,如果$_ |Get-ChildItem -Filter *.txt |Select-Object -First 1 returns anything,那么我们知道目录中至少存在1个.txt文件。

然后我们只需要获取文件夹名称,您可以使用 Select-Object -ExpandPropertyForEach-Object:

获取
Get-ChildItem -LiteralPath $PSScriptRoot -Directory -Recurse |Where-Object {
  -not($_ |Get-ChildItem -Directory |Select-Object -First 1) -and ($_ |Get-ChildItem -File -Filter *.txt |Select-Object -First 1)
} |Select-Object -ExpandProperty Name