Фильтрация наборов данных с помощью командлета Where-Object

Я хочу фильтровать наборы данных с помощью командлета Where-Object. Например, рассмотрим столбец Notifications в следующем командлете. Он содержит два значения, и я хотел бы отфильтровать его по Where-Object | {$_.Notifications -eq 'Operator1'}. Я также пытался фильтровать с помощью -in, -notin, -contains, -notcontains, -match, -notmatch, -like, -notlike и т. д. Но ни один из них пока не дал никаких результатов. Любые указатели высоко ценятся.

PS>Get-DbaAgentAlert -SqlInstance 'Redacted'

ComputerName          : Redacted
SqlInstance           : Redacted
************          : ************
************          : ************
Notifications         : {Operator1, Operator2}
************          : ************
************          : ************

Выполнение Get-Member возврата

PS>Get-DbaAgentAlert -SqlInstance 'Redacted' | Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name                  MemberType   Definition
----                  ----------   ----------
OtherColumns          **********  ***********
Notifications         NoteProperty DataTable Notifications=

Кроме того, фактический набор данных для столбца Notifications будет выглядеть так:

PS>$alerts.Notifications | Select -First 2 | Format-Table

OperatorId OperatorName     UseEmail UsePager UseNetSend HasEmail HasPager HasNetSend
---------- ------------     -------- -------- ---------- -------- -------- ----------
         1 Operator1          True    False      False     True    False      False
         2 Operator2          True    False      False     True    False      False

Спасибо!

Редактировать: источник командлета, который я здесь использую, взят из dbatools/Get. -DbaAgentAlert


person walt    schedule 15.03.2017    source источник
comment
Вы пробовали -contains? Уведомления выглядят как массив.   -  person gvee    schedule 16.03.2017
comment
Да, я сделал (упомянутый в вопросе). Но это не дало никаких результатов. Я должен был поместить источник команды, которую я использовал здесь. Это из этого модуля - dbatools   -  person walt    schedule 16.03.2017
comment
Я не совсем понимаю, какую часть результата вы хотите отфильтровать. Командлет возвращает несколько предупреждений, каждое из которых содержит несколько уведомлений, каждая строка которых содержит несколько значений. Если вы попытаетесь сравнить строку с DataRow (одной записью из Notifications DataTable), конечно, это не удастся. Вам необходимо учитывать столбцы DataTable (например, OperatorName в вашем примере)   -  person TToni    schedule 16.03.2017


Ответы (1)


Попробуй это:

Get-DbaAgentAlert -SqlInstance ".\sql2016" |
Where-Object {$_.Notifications.OperatorName -eq "test1"}

Вот как я это сделал:

$results = Get-DbaAgentAlert -SqlInstance ".\sql2016"
$res.Notifications

Это возвращает что-то вроде:

OperatorId   : 1
OperatorName : test1
UseEmail     : True
UsePager     : False
UseNetSend   : False
HasEmail     : False
HasPager     : False
HasNetSend   : False

OperatorId   : 2
OperatorName : test2
UseEmail     : True
UsePager     : False
UseNetSend   : False
HasEmail     : False
HasPager     : False
HasNetSend   : False

...свойство Notifications — это, по сути, другой объект, поэтому мы должны настроить таргетинг на правильный элемент этого объекта

person gvee    schedule 15.03.2017
comment
Я действительно должен уделять больше внимания. Спасибо большое. Это сработало! - person walt; 16.03.2017