我想在PowerShell中排除搜索中的所有目录。 FileInfo
和DirectoryInfo
都包含Attributtes
属性,这似乎正是我想要的,但我无法找到基于它的过滤方法。两个
ls | ? { $_.Attributes -ne 'Direcory' }
ls | ? { $_.Attributes -notcontains 'Direcory' }
没用。我怎么能这样做?
答案 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)
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'}