Powershell 仅返回第二级目录名

Powershell 仅返回第二级目录名,powershell,directory,powershell-4.0,Powershell,Directory,Powershell 4.0,我想检索磁盘的所有(且仅限于)二级目录名。例如,C:\folder1\folder2和C:\folder1\folder3,我只需要检索folder2和folder3 我写了这个,PS显示所有目录名: Get-ChildItem -Recurse | ?{ $_.PSIsContainer} | Select-Object Name 我发现了这一点,并以这种方式修改了前面的命令: Get-ChildItem -Recurse | `Where-Object {($_.directory -

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

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

Get-ChildItem -Recurse | ?{ $_.PSIsContainer} | Select-Object Name
我发现了这一点,并以这种方式修改了前面的命令:

 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

然后,如果您只需要添加在
|上的名称,请选择Object-ExpandProperty Name

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

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 |过滤管道?{}
,您无法在没有输入的情况下在循环scriptblock的开头进行筛选并获得任何有用的内容。这是在循环中反复运行对象{},并且没有输出

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

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

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

or

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

只有文件似乎具有
.directory
属性,而目录则没有,因此您将永远无法获得通过(
.directory
匹配模式)过滤器并同时通过(
PSIsContainer
)过滤器的内容

除了您的
PSIsContainer
过滤器不工作之外:

| ForEach-Object {?{ $_.PSIsContainer} | Select-Object Name }
这没有道理;您只能使用
cmdlet |过滤管道?{}
,您无法在没有输入的情况下在循环scriptblock的开头进行筛选并获得任何有用的内容。这是在循环中反复运行对象{},并且没有输出

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

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

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

or

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

你好我试过使用
-Directory
,效果很好。谢谢你的帮助!实际上,我还尝试在
-Directory
语句之后使用
ForEach Object{{{$$.PSIsContainer}选择Object Name
,效果很好。显然
Select Name
更好。但是…只是让你知道。谢谢!@Hari它有效吗?我尝试
gci{$.PSIsContainer}
没有输出-没有文件,没有文件夹。
$\u
没有值…?我尝试了这个命令:
Get ChildItem C:\*\*-Directory |?{$\.PSIsContainer}|选择-ExpandProperty Name
,它给了我与您相同的输出:
获取ChildItem c:\-目录|获取ChildItem-目录|选择-ExpandProperty Name
。所以…是的,它工作正常。您好!我尝试了
-目录
,它工作正常。感谢您的帮助!实际上,我还尝试了使用每个对象{code>?{$$.PSIsContainer}在
-Directory
语句之后选择对象名,它就可以工作了。显然
选择名称
更好。但是…只是让你知道。谢谢!@Hari它可以工作吗?我尝试
gci | foreach{$.pscontainer}
没有输出-没有文件,没有文件夹。
$\u
没有值…?我尝试了这个命令:
Get ChildItem C:\*\*-Directory |?{$\.PSIsContainer}|选择-ExpandProperty Name
,它将为我提供与您相同的输出:
获取ChildItem c:\-目录|获取ChildItem-目录|选择-ExpandProperty Name
。因此……是的,它可以工作。