Question utilisaton d'un where avec une chaîne construite

Plus d'informations
il y a 13 ans 11 mois #11599 par David RICQ
Bonjour,

J'ai un script qui présente des données dans un Datagridview... et jusque là tout va bien.
J'aimerai apporter une amélioration en permettant aux utilisateurs de rentrer des critères de recherche. Pour faire cela il faut ajouter un pipe comme:\" | Where{xxxxx} \".
comme j'ai plusieurs critères de recherche, je construit la chaine qui devra remplacer xxxxx. Jusque là tout va bien. J'ai testé le contenu de la chaîne il est bon

Mon problème est que lorsque l'envoie l'instruction avec la condition supplémentaire c'est comme si elle n'était pas interprétéé.

exemple :
$Where1 = '$_.Name -match \"Test\"'
$dataFind = Get-XdVirtualDesktop | Where {$Where1}

Si ce lance l'instruction écrite complétement j'ai bien un filtre....

Quelqu'un voit'il où est le problème?

Merci par avance de toutes vos aides...

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

Plus d'informations
il y a 13 ans 11 mois #11600 par Richard Lazaro
Bonjour,

Alors ceci est trés simple. Une chaîne de caractère est ... une chaîne de caractère.
Or la cmdlet Where-Object attend un booléen comme résultat dans son scriptblock.

Il faut savoir qu'une chaîne de caractère (qui est convertit en booléen) vaut $true.

Pour cela, il faut que tu interpréte ta chaîne et cela est possible avec le cmdlet Invoke-Expression

[code:1]
$Where1 = '$_.Name -match \"Test\"'
$dataFind = Get-XdVirtualDesktop | Where {Invoke-Expression $Where1}
[/code:1]

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

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

Plus d'informations
il y a 13 ans 10 mois #11601 par Laurent Dardenne
Salut,
Richard Lazaro écrit:

Pour cela, il faut que tu interpréte ta chaîne

Dans ce cas, et puisqu'on est dans le dynamisme, mieux vaut utiliser un scriptblock directement, c'est à dire du code construit à l'aide de 'texte' :
[code:1]
$Where1 = {$_.Name -match \"Test\"}
$dataFind = Get-XdVirtualDesktop | Where $Where1
[/code:1]
Ainsi pas d'ambiguité possible, on utilise du code la où le cmdlet attend du code.
Richard, l'appel à Invoke-Expression se fait à chaque appel, pas besoin de reconstruire le code de test à chaque itération.
Bdouille écrit:

Mon problème est que lorsque l'envoie l'instruction avec la condition supplémentaire c'est comme si elle n'était pas interprétéé.

Si tu utilises le terme d'instruction il faut qu'il soit lié à du code, sinon, comme le dit Richard, cela ne reste qu'une chaîne de caractères à transformer en code avant usage.

En utilisant le dynamisme, tu paramètres tjr des traitements mais au lieu de passer des données du passe du code.
Un peu de lecture ?

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 10 mois #11602 par David RICQ
Alors là... cela parait tellement évident maintenant avec ces explications.
Comment j'ai pu passer une après-midi sur ce problème?

Merci beaucoup de ton temps et de tes compétences.

A bientôt

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

Plus d'informations
il y a 13 ans 10 mois #11603 par Laurent Dardenne
Bdouille écrit:

Comment j'ai pu passer une après-midi sur ce problème?

Tout le monde y a droit, tu n'es pas le premier ni le dernier :)
C'est un passage obligé de l'apprentissage de PS, et puis lorsque l'on commence à être confronté à ce type de pb/code, c'est le signe que l'on franchi un cap.
Bdouille écrit:

Merci beaucoup de ton temps et de tes compétences.

M'est avis que \"votre temps\" et \"vos compétences\" sont plus appropriés.

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 10 mois #11604 par Richard Lazaro
Je suis d'accord avec toi d'utiliser le ScriptBlock mais est ce que cela va répondre au besoin ?

nous n'avons pas la connaissance de l'algo avant cet appel. Peut être qu'il se retrouve uniquement avec une chaîne de caractère, je suis parti de ce postulat.

Think-MS : (Get-Life).Days | %{ Learn-More }

\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein

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

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