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

Get-ChildItem c:\mypath -Recurse

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

dir /b /ad /s

当前回答

这个问题已经得到了很好的回答,但我想补充一些额外的东西,因为我刚刚看到了这个问题。

Get-ChildItem恰好产生两种类型的对象,而大多数命令只产生一种。

返回FileInfo和DirectoryInfo。

你可以通过查看该命令可用的“成员”来查看这一点,如下所示:

Get-ChildItem | Get-Member

TypeName: System.IO.DirectoryInfo TypeName: System.IO.FileInfo

您将看到每种类型可用的各种方法和属性。注意,这里有不同之处。例如FileInfo对象有一个length属性,而DirectoryInfo对象没有。

无论如何,从技术上讲,我们可以通过隔离DirectoryInfo对象只返回目录

Get-ChildItem | Where-Object {$_.GetType().Name -eq "DirectoryInfo"}

显然,正如上面的答案所述,最直接的解决方案是简单地使用Get-ChildItem -Directory,但我们现在知道如何在未来使用多种对象类型:)

其他回答

具体回答原始问题(使用IO.FileAttributes):

Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -band [IO.FileAttributes]::Directory}

但我更喜欢Marek的解决方案:

Where-Object { $_ -is [System.IO.DirectoryInfo] }

Use:

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

Use:

dir -Directory -Recurse | Select FullName

这将为您提供根结构的输出,其中仅包含目录的文件夹名称。

首先需要使用get - childitem递归地获取所有文件夹和文件。然后将输出管道到只接收文件的Where-Object子句中。

# one of several ways to identify a file is using GetType() which
# will return "FileInfo" or "DirectoryInfo"
$files = Get-ChildItem E:\ -Recurse | Where-Object {$_.GetType().Name -eq "FileInfo"} ;

foreach ($file in $files) {
  echo $file.FullName ;
}

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

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

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