Powershell where несколько условий: Фильтрация объектов с Where-Object в Powershell объектов на примерах

Содержание

powershell — Group Как обратиться выше к группе?

Объясняю. Я сортирую таблицу по датам (убираю одинаковые даты). В тоже время я хочу видеть то что я убрал и поместить в отдельное поле. В общем, показываю на рисунке.

$arr| group Login | foreach { $_.group | sort Date | select -first 1} | FT

Рис1 — это то что есть в массиве arr
Рис2 — это то что получается группировкой
Рис3 — это отсортированная таблица без одинаковых дат. Но красным справа хотелось бы видеть отдельное поле, в которой будут данные из вышестоящей Group (но не знаю как обратиться к Group)

  • powershell
PS C:\Users\alHaos> $arr = @"
andrey.mukhin              29.01.2021 15:40           29.01.2021
andrey.mukhin              29.01.2021 15:50           29.01.2021
aleksandr.shubin           29.01.2021 15:00           29.01.2021
konstantin.lysov           29.01.2021 15:55           29.01.2021
Igor.Pekishev              29.01.2021 14:00           29.01.2021
polina. proseczkaya         29.01.2021 15:08           29.01.2021
nikita.ustrikovifirtlabs.ru06.11.2020 14:15           06.11.2020
mariya.zhilyak             06.11.2020 02:32           06.11.2020
"@ -split "`r`n" | ForEach-Object {
  [PSCustomObject]@{
    Login    = $_.SubString(0, 27).Trim()
    DateFull = [datetime]::Parse($_.SubString(28, 16).Trim())
    Date     = [datetime]::Parse($_.SubString(54, 10))
  }
}
$arr | Group-Object Login, date | ForEach-Object {
    $login, $date = $_.name -split ", "
    [PSCustomObject]@{
      login = $login
      date = $date
      name2 = $_.Group
    }
}
login                       date               name2                                                                                                                                                         
-----                       ----               -----                                                                                                                                                         
andrey. mukhin               29.01.2021 0:00:00 {@{Login=andrey.mukhin; DateFull=09.01.2021 15:40:00; Date=29.01.2021 0:00:00}, @{Login=andrey.mukhin; DateFull=09.01.2021 15:50:00; Date=29.01.2021 0:00:00}}
aleksandr.shubin            29.01.2021 0:00:00 {@{Login=aleksandr.shubin; DateFull=09.01.2021 15:00:00; Date=29.01.2021 0:00:00}}                                                                            
konstantin.lysov            29.01.2021 0:00:00 {@{Login=konstantin.lysov; DateFull=09.01.2021 15:55:00; Date=29.01.2021 0:00:00}}                                                                            
Igor.Pekishev               29.01.2021 0:00:00 {@{Login=Igor.Pekishev; DateFull=09.01.2021 14:00:00; Date=29.01.2021 0:00:00}}                                                                               
polina.proseczkaya          29.01.2021 0:00:00 {@{Login=polina.proseczkaya; DateFull=09.01.2021 15:08:00; Date=29.01.2021 0:00:00}}                                                                          
nikita. ustrikovifirtlabs.ru 06.11.2020 0:00:00 {@{Login=nikita.ustrikovifirtlabs.ru; DateFull=06.11.2020 14:15:00; Date=06.11.2020 0:00:00}}                                                                 
mariya.zhilyak              06.11.2020 0:00:00 {@{Login=mariya.zhilyak; DateFull=06.11.2020 2:32:00; Date=06.11.2020 0:00:00}}                                                                               
PS C:\Users\alHaos> 






1







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации



Почта

Необходима, но никому не показывается




By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.


Where-Object (Microsoft.PowerShell.Core) — PowerShell | Microsoft Learn

  • Ссылка
Модуль:
Microsoft.PowerShell.Core

Выбирает объекты из коллекции на основании значения их свойств.

Синтаксис

Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     [-EQ]
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-FilterScript] <ScriptBlock>
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -Match
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CEQ
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -GT
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CGT
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -LT
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CLT
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -GE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CGE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -LE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CLE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -Like
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CLike
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NotLike
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNotLike
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CMatch
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NotMatch
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNotMatch
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -Contains
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CContains
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NotContains
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNotContains
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -In
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CIn
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NotIn
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNotIn
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -Is
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -IsNot
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     -Not
     [<CommonParameters>]

Описание

Командлет Where-Object выбирает объекты с определенными значениями свойств из коллекции объектов, передаваемых ему. Например, командлет можно использовать для Where-Object выбора файлов, созданных после определенной даты, событий с определенным идентификатором или компьютеров, использующих определенную версию Windows.

Начиная с Windows PowerShell 3.0 существует два разных способа создания Where-Object команды.

  • Блок скрипта. Для указания имени свойства, оператора сравнения и значения свойства можно использовать блок сценария. Where-Object возвращает все объекты, для которых оператор блока скрипта имеет значение true.

    Например, следующая команда получает процессы в классе приоритета Normal , то есть процессы, в которых значение свойства PriorityClass равно Normal.

    Get-Process | Where-Object {$_.PriorityClass -eq "Normal"}

    Все операторы сравнения PowerShell допустимы в формате блока скрипта. Дополнительные сведения см. в разделе about_Comparison_Operators.

  • Оператор сравнения. Можно также написать оператор сравнения, который больше похож на естественный язык. Операторы сравнения были представлены в Windows PowerShell 3.0.

    Например, следующие команды также получают процессы с классом приоритета Normal.
    Эти команды эквивалентны и взаимозаменяемы.

    Get-Process | Where-Object -Property PriorityClass -eq -Value "Normal"

    Get-Process | Where-Object PriorityClass -eq "Normal"

    Начиная с Windows PowerShell 3.0, Where-Object добавляет операторы сравнения в качестве параметров в Where-Object команду. Если не указано иначе, все операторы вводятся без учета регистра. До Windows PowerShell 3.0 операторы сравнения на языке PowerShell можно было использовать только в блоках скриптов.

При указании одного свойстваWhere-Objectв командлет обрабатывает значение свойства как логическое выражение. Если значение свойства Length не равно нулю, выражение принимает значение $true. Пример: ('hi', '', 'there') | Where-Object Length

Предыдущий пример функционально эквивалентен:

  • ('hi', '', 'there') | Where-Object Length -GT 0
  • ('hi', '', 'there') | Where-Object { $_.Length -gt 0 }

Дополнительные сведения о том, как PowerShell оценивает логические значения, см. в разделе about_Booleans.

Примеры

Пример 1. Получение остановленных служб

Эти команды получают список всех остановленных служб. Автоматическая $_ переменная представляет каждый объект, передаваемый командлету Where-Object .

Первая команда использует формат блока скрипта, вторая — формат инструкции сравнения. Команды фильтруют службы одинаково и возвращают те же выходные данные. Отличается только синтаксис.

Get-Service | Where-Object { $_.Status -eq "Stopped" }
Get-Service | where Status -eq "Stopped"

Пример 2.

p.*»

Пример 4. Использование формата инструкции сравнения

В этом примере показано, как использовать новый формат инструкции сравнения командлета Where-Object .

Вторая команда использует формат оператора сравнения. Он не использует псевдонимы и включает имена для каждого параметра.

Вторая команда является более естественным способом использованием формата команды сравнения. Команда заменяет where псевдоним именем командлета Where-Object и пропускает все необязательные имена параметров.

Команды фильтруют процессы одинаково и возвращают те же выходные данные. Отличается только синтаксис.

Get-Process | Where-Object -Property Handles -GE -Value 1000
Get-Process | where Handles -GE 1000

Пример 5. Получение команд на основе свойств

В этом примере показано, как написать команды, которые возвращают элементы, имеющие значения true или false или любые значения для указанного свойства. В каждом примере показан как блок скрипта, так и форматы инструкций сравнения для команды.

Команды фильтруют входные данные одинаково и возвращают те же выходные данные. Отличается только синтаксис.

# Use Where-Object to get commands that have any value for the OutputType
# property of the command. This omits commands that do not have an OutputType
# property and those that have an OutputType property, but no property value.
Get-Command | where OutputType
Get-Command | where { $_.OutputType }
# Use Where-Object to get objects that are containers. This gets objects that
# have the **PSIsContainer** property with a value of $True and excludes all
# others.
Get-ChildItem | where PSIsContainer
Get-ChildItem | where { $_.PSIsContainer }
# Finally, use the -not operator (!) to get objects that are not containers.
# This gets objects that do have the **PSIsContainer** property and those
# that have a value of $False for the **PSIsContainer** property.
Get-ChildItem | where -Not PSIsContainer
Get-ChildItem | where { !$_.PSIsContainer }

Пример 6. Использование нескольких условий

Get-Module -ListAvailable | where {
    ($_. Name -notlike "Microsoft*" -and $_.Name -notlike "PS*") -and $_.HelpInfoUri
}

В этом примере показано, как создать Where-Object команду с несколькими условиями.

Эта команда получает вспомогательные модули, которые поддерживают функцию обновляемой справки. Команда использует параметр ListAvailable командлета Get-Module для получения всех модулей на компьютере. Оператор конвейера (|) отправляет модули командлету Where-Object , который получает модули, имена которых не начинаются с Microsoft или PS, и имеют значение свойства HelpInfoURI , которое сообщает PowerShell, где найти обновленные файлы справки для модуля. Логический -and оператор соединяет операторы сравнения.

В примере используется формат команды блока сценария. Логические операторы, такие как -and,-or и -not допустимы только в блоках скрипта. Их нельзя использовать в формате инструкции Where-Object сравнения команды.

  • Дополнительные сведения о логических операторах PowerShell см. в разделе about_Logical_Operators.
  • Дополнительные сведения о функции обновляемой справки см. в разделе about_Updatable_Help.

Параметры

-CContains

-CEQ

-CGE

-CGT

-CIn

-CLE

-CLike

-CLT

-CMatch

-CNE

-CNotContains

-CNotIn

-CNotLike

-CNotMatch

-Contains

-EQ

-FilterScript

-GE

-GT

-In

-InputObject

-Is

-IsNot

-LE

-Like

-LT

-Match

-NE

-Not

-NotContains

-NotIn

-NotLike

-NotMatch

-Property

-Value

Входные данные

PSObject

В этот командлет можно передать любой объект.

Выходные данные

Object

Этот командлет возвращает выбранные элементы из входного набора объектов.

Примечания

PowerShell включает следующие псевдонимы для Where-Object:

  • Все платформы:
    • ?
    • where

Начиная с Windows PowerShell 4.0, Where методы и ForEach были добавлены для использования с коллекциями.

Дополнительные сведения об этих методах см. здесь about_arrays

  • Compare-Object
  • ForEach-Object
  • Group-Object
  • Measure-Object;
  • New-Object
  • Select-Object;
  • Sort-Object
  • Tee-Object
  • about_Booleans

Как использовать несколько условий в PowerShell Where-Object?

Пауэршелл

3 месяца назад

от Мухаммад Фархан

В PowerShell командлет « Where-Object » используется для фильтрации объектов или значений из объекта. Фильтр Where-Object содержит одно или несколько условий. Фильтр с несколькими условиями позволяет отфильтровывать элементы и возвращать только некоторые из них, которые соответствуют этим условиям.

Чтобы применить Where-Object, рекомендуется подключить его к другим командлетам PowerShell. Кроме того, можно задать несколько условий с помощью блоков скриптов, различных операторов и т. д.

Этот пост демонстрирует работу и использование нескольких условий в PowerShell Where-Object.

Как использовать несколько условий в PowerShell «Where-Object»?

PowerShell предоставляет следующие три возможности использования нескольких условий в PowerShell:

  • Использование блоков сценария и операторов равенства.
  • Использование блоков сценариев и операторов сдерживания.
  • Использование блоков сценария, равенство и операторы сопоставления.

Метод 1: использование нескольких условий в PowerShell «Where-Object» с блоками сценария и операторами равенства

Блок сценария содержит набор нескольких операторов, заключенных в фигурные скобки. Эти типы блоков можно объединять с помощью командлета Where-Object с помощью параметра « -FilterScript ».

Пример

В следующем примере мы используем операторы равенства с блоками скрипта для использования нескольких условий в PowerShell.

Давайте разберемся, как создается блок сценария, используя приведенный ниже синтаксис:

> {$_.PropertyName -matching-parameter }

В приведенном выше синтаксисе « $_. — это символ, используемый для обозначения свойства. Свойство и его значение (для поиска) соединяются с помощью любого оператора равенства (-gt, -ge, -lt, -le, -eq).

Здесь мы будем использовать блок сценария для фильтрации процессов на основе использования ЦП процессом и NPM (неподкачиваемая память, используемая процессом). С помощью блока скриптов фильтруются процессы, удовлетворяющие следующим условиям:

  • Число NPM больше или равно 30
  • Загрузка ЦП более 3000:

> Процесс получения | Where-Object -FilterScript {($_.NPM -lt 30) -and ($_.CPU -gt 300)}

Вывод показывает, что только процессы, у которых NPM больше

Метод 2: использование нескольких Условия в PowerShell «Where-Object» с блоками сценариев и операторами включения

Операторы включения — это типы операторов сравнения. Эти операторы легко понять и прочитать по сравнению с блоками сценариев в PowerShell.

Список операторов защитной оболочки и их подходящие описания приведены в следующей таблице:

Оператор Описание
«-содержит» Значение справа от оператора присутствует в группе значений слева.
«-cсодержит» Правый операнд присутствует в группе значений справа. -ccontains чувствителен к регистру.
«-не содержит» Значение в правой части оператора отсутствует в левой части.
«-cnotcontains» Этот оператор работает так же, как и оператор -notcontains, но с учетом регистра.

Пример

> Get-Service | Where-Object {($_.StartType -in ‘Manual’) -and ($_.Status -notcontains ‘Running’)}

В соответствии с приведенным выше кодом:

  • « ($_. StartType -in ‘Manual’) » выборка сервисов, которые находятся в режиме « Manual ».
  • « » используется в качестве конкатенатора для объединения обоих условий.
  • » ($_.Status -notcontains ‘Running’) ” получить службы, которые не запущены, что означает службы, которые остановлены:

Метод 3: использование нескольких условий в PowerShell «Where-Object» с использованием операторов равенства и сопоставления

Операторы сопоставления используются для сопоставления заданного условия или шаблона элементов. Эти операторы включают «-match», «-notmatch», «-like» и «-notlike ».

Пример

Эта команда содержит несколько условий, основанных на равенстве и операторах сопоставления:

> Get-Command | Where-Object {($_.CommandType -eq ‘cmdlet’) -and ($_.Name -like ‘*import*’)}

Согласно этому примеру:

  • ($_.CommandType -eq ‘командлет’) » получить команды, равные « cmdlet », используя оператор « -eq ».
  • « ($_.Name -like ‘*import*’) » получить имена, начинающиеся с « Import », используя оператор « -like »:

Это все об использовании нескольких условий в PowerShell.

Заключение

Множественные условия — это условия, в которых определено более двух утверждений или условий. Эти условия используются в PowerShell « Where-Object » с комбинацией блоков сценария и операторов сравнения. В этом посте представлено полное руководство по использованию нескольких условий в PowerShell.

Об авторе

Мухаммед Фархан

Я выпускник факультета компьютерных наук, а сейчас технический писатель, который любит предлагать самые простые решения самых сложных проблем, связанных с Windows, Linux и веб-дизайном. Моя любовь к компьютерным наукам проявляется каждый день из-за их легкости в нашей повседневной жизни.

Посмотреть все сообщения

windows 7 — Множественное -и -или в выражении PowerShell Where-Object

спросил

Изменено
10 месяцев назад

Просмотрено
337 тысяч раз

 PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:\dfsroots\datastore2\public} | Где-Объект {{ $_. e
xtension-match "xls" -or $_.extension-match "xlk" } -and { $_.creationtime -ge "01.06.2014"}}
 

Выше приведен мой пример кода. Я пытаюсь удаленно запустить этот код PowerShell на своем файловом сервере и заставить его возвращать все файлы .xls и .xlk с датой создания 01.06.2014 или более поздней. Когда я запускаю этот код, он начинает выплевывать все папки в этом удаленном месте. Если сравнить только две вещи, например:

 PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:\dfsroots\datastore2\public} | Where-Object { $_.extension-match "xls" -and $_.creationtime -ge "01.06.2014"}
 

Отображаются только файлы xls, созданные в эту дату или позже. Что тут происходит? Нужно ли мне использовать что-то другое, кроме операторов гнезда , и или ?

  • powershell
  • windows-7
  • windows-server-2008
  • windows-server-2003

6

Оборачивая ваши сравнения в {} в первом примере, вы создаете ScriptBlocks; поэтому интерпретатор PowerShell рассматривает его как Где-Объект { -and } . Поскольку операторы - и работают с логическими значениями, PowerShell приводит ScriptBlocks к логическим значениям. В PowerShell все, что не является пустым, нулевым или нулевым, является истинным. Тогда оператор выглядит как Where-Object { $true -and $true } , что всегда верно.

Вместо {} используйте скобки () .

Также вы хотите использовать -eq вместо -match , так как match использует регулярное выражение и будет истинным, если шаблон найден в любом месте строки (попробуйте: 'xlsx' -match 'xls' ).

 Invoke-Command -computername SERVERNAME {
    Get-ChildItem -path E:\dfsroots\datastore2\public |
        Где-объект {($_.extension -eq ".xls" -или $_.extension -eq ".xlk") -and ($_.creationtime -ge "01.06.2014")}
}
 

Лучше отфильтровать расширения с помощью команды Get-ChildItem .

 Invoke-Command -computername SERVERNAME {
    Get-ChildItem -path E:\dfsroots\datastore2\public\* -Include *. xls, *.xlk |
        Где-Объект {$_.creationtime -ge "01.06.2014"}
}
 

2

Вы используете фигурные скобки вместо скобок.

Оператор where хранится внутри блока скрипта, который определяется с помощью изогнутых оснований { } . Чтобы изолировать/обернуть ваши тесты, вы должны использовать скобки () .

Я также предлагаю попробовать выполнить фильтрацию на удаленном компьютере. Попробуйте:

 Invoke-Command -computername SERVERNAME {
    Get-ChildItem -path E:\dfsroots\datastore2\public |
    Where-Object { ($_.extension -eq "xls" -или $_.extension -eq "xlk") -и $_.creationtime -ge "01.06.2014" }
}
 

2

Я нашел решение здесь:

Как правильно фильтровать несколько строк в скрипте копирования PowerShell 00 $Расположение = » C:\пользователь\файлы»
$result = (Get-ChildItem $Location\* -Include *.png, *.gif, *.jpg)

Не забудьте поставить «*» после пути.