Исключить каталоги в PowerShell - PullRequest
24 голосов
/ 08 августа 2009

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

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

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

Ответы [ 3 ]

25 голосов
/ 08 августа 2009

Вы можете использовать свойство 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
9 голосов
/ 02 апреля 2012

Исключить каталоги в 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]}
6 голосов
/ 09 августа 2009

Вы также можете отфильтровать каталоги, посмотрев на их тип напрямую:

ls | ?{$_.GetType() -ne [System.IO.DirectoryInfo]}

Каталоги возвращаются get-childitem (или ls или dir) типа System.IO.DirectoryInfo, а файлы имеют тип System.IO.FileInfo. При использовании типов в качестве литералов в Powershell их необходимо заключать в квадратные скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...