我想在PowerShell中排除搜索中的所有目录.双方FileInfo并DirectoryInfo包含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)
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)
您还可以通过直接查看其类型来过滤目录:
ls | ?{$_.GetType() -ne [System.IO.DirectoryInfo]}
Run Code Online (Sandbox Code Playgroud)
目录由System.IO.DirectoryInfo类型的get-childitem(或ls或dir)返回,文件类型为System.IO.FileInfo.在Powershell中使用类型作为文字时,您需要将它们放在括号中.
| 归档时间: |
|
| 查看次数: |
19686 次 |
| 最近记录: |