在PowerShell中排除目录

svi*_*ick 25 powershell

我想在PowerShell中排除搜索中的所有目录.双方FileInfoDirectoryInfo包含Attributtes这似乎是正是我想要的属性,但我没能找出如何过滤器的基础上.都

ls | ? { $_.Attributes -ne 'Direcory' }
ls | ? { $_.Attributes -notcontains 'Direcory' }
Run Code Online (Sandbox Code Playgroud)

没用.我怎样才能做到这一点?

Joe*_*oey 25

您可以使用该PSIsContainer属性:

gci | ? { !$_.PSIsContainer }
Run Code Online (Sandbox Code Playgroud)

您的方法也可以,但必须如下所示:

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

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

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

gci | ? { "$($_.Attributes)" -notmatch "Directory" }
Run Code Online (Sandbox Code Playgroud)

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

PowerShell v3最后有一个-Directory参数Get-ChildItem:

Get-ChildItem -Directory
gci -ad
Run Code Online (Sandbox Code Playgroud)

  • 对于任何想知道的人,`?`是`Where-Object`的别名. (3认同)

Ala*_*Dea 9

在PowerShell中排除目录:

Get-ChildItem | Where-Object {$_ -isnot [IO.DirectoryInfo]}
Run Code Online (Sandbox Code Playgroud)

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

gci | ? {$_ -isnot [io.directoryinfo]}
Run Code Online (Sandbox Code Playgroud)

感谢@Joey使用-is运营商的深刻见解:)

然而

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

仅包含文件:

Get-ChildItem | Where-Object {$_ -is [IO.FileInfo]}
Run Code Online (Sandbox Code Playgroud)

要么:

gci | ? {$_ -is [io.fileinfo]}
Run Code Online (Sandbox Code Playgroud)

包括目录:

Get-ChildItem | Where-Object {$_ -is [IO.DirectoryInfo]}
Run Code Online (Sandbox Code Playgroud)

要么:

gci | ? {$_ -is [io.directoryinfo]}
Run Code Online (Sandbox Code Playgroud)


Ant*_*pos 6

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

ls | ?{$_.GetType() -ne [System.IO.DirectoryInfo]}
Run Code Online (Sandbox Code Playgroud)

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

  • 顺便说一句,您可以使用`-is`运算符来执行此操作.所以它可以缩写为:`gci | ?{$ _ -is [IO.FileInfo]}` (4认同)