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

Plus d'informations
il y a 13 ans 10 mois #11605 par David RICQ
re,

Oui merci de votre temps et de vos compétences (j'avais répondu dans la minute de la deuxième réponse)

Apres divers tests ce qui fonctionne le mieux est le \"Invoke-Expression\". Avec le scriptblock j'ai un retour en erreur de Where-Object
Where-Object : Cannot bind parameter 'FilterScript'. Cannot convert the \"{$_.Name -match \"P2PN\"}\" value of type \"System.String\" to type \"System.Management.Automation.Scrip
tBlock\".

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

Plus d'informations
il y a 13 ans 10 mois #11606 par Richard Lazaro
L'erreur vient du fait que c'est toujours un objet de type chaîne de caractère System.String et non scripotblock.

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 #11611 par Laurent Dardenne
Richard Lazaro écrit:

mais est ce que cela va répondre au besoin ?

Tel que présenté, non, tu as raison.
Richard Lazaro écrit:

nous n'avons pas la connaissance de l'algo avant cet appel.

C'est vrai, mais ce qui nous intéresse dans le pb présenté, c'est le résultat de la construction du filtre, une chaîne de caractères et sa transformation en code.

Il manque un élément dans ma réponse, à savoir la construction dynamique du scriptblock :
[code:1]
#construit une chaine représentant du code
$DéfinitionDuFiltreConstruit='$_.FullName -match \"temp\"'
#construit du code
$FiltreConstruit=$ExecutionContext.InvokeCommand.NewScriptBlock($DéfinitionDuFiltreConstruit)
#Exécute le code
$dataFind = Dir C:\Temp\*.* | Where $FiltreConstruit
[/code:1]
Ici j'ai supposé que le filtre était tjr présent et que le besoin était basé sur un scriptblock.

Si on veut construire l'intégralité de l'appel, il faut reprendre ta proposition :
[code:1]
$Where1 = '$_.FullName -match \"temp\"'
$dataFind = Dir C:\Temp\*.* | Where {Invoke-Expression $Where1}
[/code:1]
et la modifier par exemple comme ceci :
[code:1]
$Where1 = '$_.FullName -match \"temp\"'
$path='c:\temp\*.*'
$Code=@\"
Dir $Path | Where {$Where1}
\"@
$dataFind = Invoke-Expression $Code
[/code:1]
Et là, effectivement comme tu l'as dit, le développeur doit connaitre les specs fonctionnelles pour proposer une solution complète.
Pour le moment il est question du mécanisme d'appel du code construit.

Tutoriels PowerShell

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

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