Question Recherche dans un tableau d'objets.

Plus d'informations
il y a 15 ans 2 mois #8192 par christophe
Bonjour à tous,

je cherche un moyen d'effectuer des recherches dans un tableau contenant des objets. Je m'explique :

j'ai un ensemble d'objets (ayant 4 propriétés) contenu dans un tableau $groups. Je cherche à pouvoir réaliser une recherche sur les valeurs des propriétés et en cas de résultat positif pouvoir récupérer l'index du tableau ainsi que les autres propriétés.

j'ai bien pensé faire une boucle en testant les 4 propriétés,mais côté optimisation :unsure:

J'espère avoir été assez clair dans mes explications :unsure:

Existe-t-il une fonction particulière ?
Auriez-vous une piste à me donner ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #8196 par Laurent Dardenne
Salut,
une solution à l'aide de générique :
[code:1]
#Tableau d'objets
$T=1..10|% {New-object PSCustomObject -Property @{P1=($_* 2);P2=($_* 3);P3=(\"A\" * $_);P4=(\"B\" * (10-$_))} }

#Crée un délégué générique, de classe Prédicate
$deleg = New-Delegate System.Predicate[Object] {
param ($Value)
Write-Warning $value
$Value.P1 -eq 10 -and
$Value.P2 -eq 15 -and
$Value.P3 -eq 'AAAAA' -and
$Value.P4 -eq 'BBBBB'
}

#Obtient la signature de la méthode [System.Array]::FindIndex utilisant un délégué générique
#Il existe + signatures, on l'affiche à l'aide :
# [System.Array].GetMethods('Public, Static') | % { $_.ToString() }
[System.Reflection.MethodInfo] $Methode = GetMethodEx Array 'Int32 FindIndex[T](T[], System.Predicate`1[T])'

#Crée la méthode avec le type du tableau manipulé, à savoir [Object]
$MethodeGenerique = $Methode.MakeGenericMethod([Object])

#Appel la méthode via Invoke
$Index=$MethodeGenerique.Invoke($null,@($T,$Deleg))
#Résulat = 4
$T[$Index]
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 5/12/10 14:12

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #8204 par Jacques Barathon
Plus prosaïquement, ceci peut permettre de filtrer les objets d'un tableau selon la correspondance d'une de leurs propriétés avec un texte donné :

[code:1]
$array | where {($_ | select * | out-string) -match \&quot;texte\&quot;}
[/code:1]

On peut sans doute optimiser, mais tel quel ça devrait marcher (testé sur deux ou trois tableaux vite fait, tout retour sera le bienvenu :)).

Attention quand même, tel quel le résultat de la correspondance porte à la fois sur le contenu et sur le nom des propriétés.<br><br>Message édité par: janel, à: 6/12/10 10:03

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #8210 par Arthur
Je ne sais pas si c'est le plus optimisé mais si tu veux faire une recherche dans un tableau suivant une ou plusieurs propriétés pourquoi ne pas filtrer le tableau de cette façon ?

(Avec un le meme tableau que celui de laurent)
[code:1]$T | Where { $_.P1 -eq 2 } | Where { $_.P2 -eq 3 } | where { $_.P3 -eq \&quot;A\&quot; } | wher
e { $_.P4 -eq \&quot;BBBBBBBBB\&quot; }[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #8211 par Jacques Barathon
Une version un peu plus évoluée qui évite de tomber sur des occurrences de texte qui figureraient dans les noms de propriétés :

[code:1]
# where-text.ps1

param ([String]$text)

@($input) | where {
($_.psobject.properties | foreach {$_.value} | out-string) -match $text
}
[/code:1]

Par exemple :

[code:1]
PS&gt; get-service | where-text messenger

Status Name DisplayName
----
Running lanmanworkstation Workstation
Stopped Messenger Messenger
Running PlugPlay Plug and Play
Running RpcSs Remote Procedure Call (RPC)
[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #8213 par Jacques Barathon
Petite correction qui permet de faire des recherches plus précises sur une valeur de propriété en utilisant la syntaxe des expressions régulières :

[code:1]
# where-text

param ([String]$text)

@($input) | where {
($_.psobject.properties | foreach {$_.value} | out-string -stream) -match $text
}
[/code:1]

En reprenant l'objet $T créé par Laurent dans son premier exemple, on peut donc faire les filtrages suivants :

[code:1]
# création du tableau $T :
PS&gt; $T=1..10|% {New-object PSCustomObject -Property @{P1=($_* 2);P2=($_* 3);P3=(\&quot;A\&quot; * $_);P4=(\&quot;B\&quot; * (10-$_))}}

# éléments dont une propriété se termine par 3 :
PS&gt; $T | where-text '3$'

P2 P1 P4 P3
-- -- -- --
3 2 BBBBBBBBB A

# éléments dont une propriété est une chaîne avec au moins 4 'B' à la suite :
PS&gt; $T | where-text 'B{4}'

P2 P1 P4 P3
-- -- -- --
3 2 BBBBBBBBB A
6 4 BBBBBBBB AA
9 6 BBBBBBB AAA
12 8 BBBBBB AAAA
15 10 BBBBB AAAAA
18 12 BBBB AAAAAA

# éléments dont une propriété est exactement 'AAA'
PS&gt; $T | where-text '^AAA$'


P2 P1 P4 P3
-- -- -- --
9 6 BBBBBBB AAA


[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.097 secondes
Propulsé par Kunena