Return 仅二级目录名

Return the second level directory names only

我想检索我磁盘的所有(且仅)二级目录名称。例如C:\folder1\folder2C:\folder1\folder3,我只需要检索folder2folder3

我写这个 PS 显示所有目录名称:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer} | Select-Object Name

我找到了这个help,我把之前的命令修改成这样:

 Get-ChildItem -Recurse |  `Where-Object {($_.directory -match '^*\\S*$')} ` | ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name }

但是当我使用它时 PS 没有显示任何东西。

我不明白为什么,有人可以帮助我吗?谢谢!

您应该能够使用一些有趣的通配符来获得您想要的内容。

Get-ChildItem \*\*\ | Where-Object{$_.PSIsContainer}

或者,如果您至少有 PowerShell 3.0,这会更快

Get-ChildItem \*\*\ -Directory

然后,如果您只想要 | Select-Object -ExpandProperty Name

上的名称

只有文件似乎有 .directory 属性,目录没有,所以你永远不会得到通过你的(.directory 匹配模式)过滤器并通过你的过滤器的东西(PSIsContainer) 过滤器。

除了你的 PSIsContainer 过滤器不起作用:

| ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name }

这没有意义;您只能使用 ?cmdlet | ? {} 过滤管道,您不能在没有输入的循环脚本块开始时进行过滤并获得任何有用的信息。这是 运行 where-object {} 一遍又一遍地循环,并且没有输出。

使用 -Recurse 会非常慢,因为您会一直进入每个目录,并为所有文件创建 [fileinfo] 对象。

除了 Matt 的通配符答案外,假设 PS v3 或更高版本,您可以列出根目录中的所有目录,然后列出其中的所有目录,然后到此为止:

Get-ChildItem c:\ -Directory | Get-ChildItem -Directory | Select -ExpandProperty Name

or

gci c:\ -Dir | ForEach { (gci $_ -Dir).Name }

这里有完整路径,网络兼容:

(Get-ChildItem "\folder1\" -Dir).fullname | ForEach {(Get-ChildItem $_ -Dir).name}

要将其存储在数组中吗?

$subfolders = (Get-ChildItem "\folder1\" -Dir).fullname | ForEach {(Get-ChildItem $_ -Dir).name}