在PowerShell中排除目录

时间:2009-08-08 11:36:51

标签: powershell

我想在PowerShell中排除搜索中的所有目录。 FileInfoDirectoryInfo都包含Attributtes属性,这似乎正是我想要的,但我无法找到基于它的过滤方法。两个

ls | ? { $_.Attributes -ne 'Direcory' }
ls | ? { $_.Attributes -notcontains 'Direcory' }

没用。我怎么能这样做?

4 个答案:

答案 0 :(得分:25)

您可以使用PSIsContainer属性:

gci | ? { !$_.PSIsContainer }

您的方法也可以,但必须看起来像这样:

gci | ? { !($_.Attributes -band [IO.FileAttributes]::Directory) }

因为属性是枚举和位掩码。

或者,对于您的其他方法:

gci | ? { "$($_.Attributes)" -notmatch "Directory" }

这将导致属性转换为字符串(可能看起来像“Directory,ReparsePoint”),并且在字符串上可以使用-notmatch运算符。

PowerShell v3最终在-Directory上有一个Get-ChildItem参数:

Get-ChildItem -Directory
gci -ad

答案 1 :(得分:9)

排除PowerShell中的目录:

Get-ChildItem | Where-Object {$_ -isnot [IO.DirectoryInfo]}

或者它很简洁,但阅读版本更难:

gci | ? {$_ -isnot [io.directoryinfo]}

使用-is运算符来表达对@Joey的深刻见解:@)

然而

从技术上讲,我更喜欢仅包含文件或只有目录,因为排除可能会导致意外结果,因为Get-ChildItem可以返回的不仅仅是文件和目录:)

仅包含文件:

Get-ChildItem | Where-Object {$_ -is [IO.FileInfo]}

或者:

gci | ? {$_ -is [io.fileinfo]}

仅包括目录:

Get-ChildItem | Where-Object {$_ -is [IO.DirectoryInfo]}

或者:

gci | ? {$_ -is [io.directoryinfo]}

答案 2 :(得分:6)

您还可以通过直接查看其类型来过滤目录:

ls | ?{$_.GetType() -ne [System.IO.DirectoryInfo]}

目录由System.IO.DirectoryInfo类型的get-childitem(或ls或dir)返回,文件类型为System.IO.FileInfo。在Powershell中将类型用作文字时,需要将它们放在括号中。

答案 3 :(得分:0)

ls |?{$_.mode -notmatch 'd-'}ls |?{$_.Attributes -ne 'Directory'}