我想检索磁盘的所有(也是唯一的)二级目录名。例如,C:\folder1\folder2
和C:\folder1\folder3
,我只需要检索folder2
和folder3
。
我写这个,PS显示所有目录名称:
Get-ChildItem -Recurse | ?{ $_.PSIsContainer} | Select-Object Name
我发现了这个help,我用这种方式修改了上一个命令:
Get-ChildItem -Recurse | `Where-Object {($_.directory -match '^*\\\S*$')} ` | ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name }
但是当我使用它时,PS不会显示任何内容。
我无法理解为什么,有人可以帮助我吗?谢谢!
答案 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