2017-03-15 3 views
0

Je cherche à filtrer les ensembles de données avec une applet de commande Where-Object. Par exemple, considérez la colonne Notifications dans la cmdlet suivante. Il contient deux valeurs et je voudrais le filtrer par Where-Object | {$_.Notifications -eq 'Operator1'}. J'ai également essayé de filtrer en utilisant -in, -notin, -contains, -notcontains, -match, -notmatch, -like, -notlike etc. Mais aucun de ceux-ci n'a donné de résultats jusqu'à présent. Tout pointeur est très apprécié.Filtrer les ensembles de données à l'aide de la cmdlet Where-Object

PS>Get-DbaAgentAlert -SqlInstance 'Redacted' 

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

fait un Get-Member retours

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

    TypeName: System.Management.Automation.PSCustomObject 

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

En outre, le jeu de données réelles pour Notifications colonne ressembleraient

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 

Merci!

Edit: Source de l'applet de commande J'utilise ici est de dbatools/Get-DbaAgentAlert

+0

Avez-vous essayé '-contains'? Les notifications ressemblent à un tableau. – gvee

+0

Oui, je l'ai fait (mentionné dans la question). Mais, il n'a pas retourné de résultats. J'aurais dû mettre la source de la commande que j'utilisais ici. C'est à partir de ce module - [dbatools] (https://dbatools.io/) – walt

+0

Je ne suis pas très clair sur la partie du résultat que vous voulez filtrer. L'applet de commande renvoie des alertes, chacune contenant des notifications, chaque ligne contenant plusieurs valeurs. Si vous essayez de comparer une chaîne à un DataRow (une seule entrée à partir du DataTable Notifications), bien sûr, cela échouera. Vous devez prendre en compte les colums DataTable (comme "OperatorName" dans votre exemple) – TToni

Répondre

0

Essayez ceci:

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

Voilà comment je travaillais que sur:

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

Ce rendement quelque chose comme:

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 

... la Notifications propriété est fondamentalement un autre objet, donc nous devons cibler l'élément correct de que objet

+1

Je devrais vraiment faire plus attention. Merci beaucoup. Ça a marché! – walt