Исключить каталоги в PowerShell
Я хочу исключить все каталоги из моего поиска в PowerShell. Оба FileInfo
и DirectoryInfo
содержат свойство Attributtes
, которое, похоже, именно то, что я хочу, но я не смог выяснить, как фильтровать на нем. Оба
ls | ? { $_.Attributes -ne 'Direcory' }
ls | ? { $_.Attributes -notcontains 'Direcory' }
не работает. Как я могу это сделать?
Ответы
Ответ 1
Вы можете использовать свойство 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
Ответ 2
Исключить каталоги в PowerShell:
Get-ChildItem | Where-Object {$_ -isnot [IO.DirectoryInfo]}
Или это краткое, но труднее читать версию:
gci | ? {$_ -isnot [io.directoryinfo]}
Кредит отправляется @Joey за его проницательный комментарий с помощью оператора -is
:)
Однако
Технически я предпочитаю включать только файлы или только каталоги, поскольку исключение может привести к неожиданным результатам, поскольку Get-ChildItem может возвращать больше, чем просто файлы и каталоги:)
Включить только файлы:
Get-ChildItem | Where-Object {$_ -is [IO.FileInfo]}
Или:
gci | ? {$_ -is [io.fileinfo]}
Включить только каталоги:
Get-ChildItem | Where-Object {$_ -is [IO.DirectoryInfo]}
Или:
gci | ? {$_ -is [io.directoryinfo]}
Ответ 3
Вы также можете отфильтровывать каталоги, просматривая их тип напрямую:
ls | ?{$_.GetType() -ne [System.IO.DirectoryInfo]}
Каталоги возвращаются get-childitem (или ls или dir) типа System.IO.DirectoryInfo, а файлы имеют тип System.IO.FileInfo. При использовании типов в качестве литералов в Powershell вам нужно поместить их в скобки.