我使用的是PowerShell 2.0,我想输出某个路径的所有子目录。下面的命令输出所有文件和目录,但我不知道如何过滤掉这些文件。

Get-ChildItem c:\mypath -Recurse

我尝试使用$_。属性来获取属性,但我不知道如何构造System.IO.FileAttributes的字面实例来进行比较。在cmd.exe中就是这样

dir /b /ad /s

当前回答

您可以尝试PsIsContainer对象

Get-ChildItem -path C:\mypath -Recurse | where {$_.PsIsContainer -eq $true} 

其他回答

公认的答案提到

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

获取一个“原始字符串”。 但实际上select。system。io。directoryinfo类型的对象会被返回。对于原始字符串,可以使用以下方法:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

如果该值连接到一个字符串,则区别很重要:

foo\@{FullName=bar} foreach操作符为预期的:foo\bar

对于PowerShell 3.0及更高版本:

Get-ChildItem -Directory

您还可以使用别名dir、ls和gci


对于低于3.0的PowerShell版本:

Get-ChildItem返回的FileInfo对象有一个“base”属性piscontainer。您只需要选择这些项。

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

如果您想要目录的原始字符串名称,您可以这样做

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

Use:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }

我的解决方案是基于TechNet文章Get-ChildItem Cmdlet可以做的有趣的事情。

Get-ChildItem C:\foo | Where-Object {$_.mode -match "d"}

我在我的剧本中使用了它,效果很好。

一个更易于阅读和简单的方法可以实现下面的脚本:

$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
    if ($_.Attributes -eq "Directory") {
        Write-Host $_.FullName
    }
}

希望这能有所帮助!