Подтвердить что ты не робот

Исключить каталоги в PowerShell

Я хочу исключить все каталоги из моего поиска в PowerShell. Оба FileInfo и DirectoryInfo содержат свойство Attributtes, которое, похоже, именно то, что я хочу, но я не смог выяснить, как фильтровать на нем. Оба

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

не работает. Как я могу это сделать?

4b9b3361

Ответ 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 вам нужно поместить их в скобки.