仅返回第二级目录名

时间:2016-09-08 16:23:05

标签: powershell directory powershell-v4.0

我想检索磁盘的所有(也是唯一的)二级目录名。例如,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不会显示任何内容。

我无法理解为什么,有人可以帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:2)

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

除了PSIsContainer过滤器无法正常工作:

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

这没有意义;您只能使用带有?的{​​{1}}来过滤管道,您无法在没有输入的情况下在循环脚本块的开头进行过滤,并获得任何有用的信息。这在循环中反复运行cmdlet | ? {},而且没有输出。

使用-Recurse将非常慢,因为你一直到每个目录到最后,并为所有文件制作[fileinfo]对象。

除了Matt的通配符答案,假设PS v3或更高版本,您可以列出根目录中的所有目录,然后列出其中的所有目录,并停在那里:

where-object {}

答案 1 :(得分:1)

你应该能够使用一些有趣的通配符来获得你想要的东西。

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

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

Get-ChildItem \*\*\ -Directory

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

上添加名称