Question Pipeline et mémorisation dans une hastable

Plus d'informations
il y a 15 ans 10 mois #2349 par Laurent Dardenne
Salut,
j'ai un petit soucis de récupération d'informations issues d'un pipeline dans une hashtable.
Le code d'origine :
[code:1]
cd HKLM:\SOFTWARE\Classes
dir \".*\"|? {!($_.Name -match \"\*\"«»)}|% {get-itemproperty -path $_.PSPath|% {if ($_.\"Content Type\" -ne \"\"«») {$_}}}|% {$Result=@{}} {$Result.($_.PSChildName)=$_.'Content type'}[/code:1]
ici je récupére bien une hastable mais avec la variable $Result déclarée dans la portée courante.
Il est possible d'utiliser un scriptblock :
[code:1]$sb={
dir \".*\"|? {!($_.Name -match \"\*\"«»)}|% {get-itemproperty -path $_.PSPath|% {if ($_.\"Content Type\" -ne \"\"«») {$_}}}|% {$Result=@{}} {$Result.($_.PSChildName)=$_.'Content type'}
$Result
}
$Mime=&$sb[/code:1]
C'est une solution mais j'aimerais, si possible, me passer du scriptblock.

J'ai aussi tenté cette approche mais je récupère un tableau d'objet et pas une hastable :
[code:1]dir \".*\"|? {!($_.Name -match \"\*\"«»)}|% {get-itemproperty -path $_.PSPath|% {if ($_.\"Content Type\" -ne \"\"«») {$_}}}|% {new-object System.Collections.DictionaryEntry $_.PSChildName, $_.'Content type'}[/code:1]
Concernant le code il est sensé récupérer les types MIME declarés dans la base de registre.

Si vous avez une piste ou un exemple, je suis preneur :)

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 10 mois #2358 par Arnaud Petitjean
Bonsoir Laurent,

Je viens de jeter un oeil à tes scripts, et je dois dire que c'est pas évident de comprendre la logique de quelqu'un d'autre, surtout avec autant de pipeline et de foreach imbriqués...:blink:

Peut-être serait-il plus simple d'en faire une belle fonction ?

D'autre part je comprends pas bien ce que tu veux améliorer ?

ici je récupére bien une hastable mais avec la variable $Result déclarée dans la portée courante.


Qu'est ce qui te pose problème ?

Arnaud
PS: tu as maintenant la possibilité de modifier tes articles non publiés en allant dans ton profil utilisateur. Mail moi si tu n'y arrives pas.

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 15 ans 10 mois #2361 par Laurent Dardenne
Salut,
Arnaud écrit:

Je viens de jeter un oeil à tes scripts, et je dois dire que c'est pas évident de comprendre la logique de quelqu'un d'autre,

Oui désolé, j'ai oublié de commenter :whistle:
[code:1]
cd HKLM:\SOFTWARE\Classes
#On ne prend que les clés portant sur une extension de fichier sauf celles contenant '*' qui renvoient sur la même liste
dir \".*\"|Where {!($_.Name -match \"\*\"«»)}|`
#Pour chaque clés on parcourt la liste des propriétés
#Seul nous intéresse les clés ayant la propriété \"Content Type\"
Foreach {get-itemproperty -path $_.PSPath|Foreach {if ($_.\"Content Type\" -ne \"\"«») {$_}}}|`
#On récupére le couple extension, mimeType dans une hastable (.bmp,image/bmp)
Foreach {$Result=@{}} {$Result.($_.PSChildName)=$_.'Content type'} {$Result;Remove-Variable Result}
[/code:1]
Le second segment peut être simplifié, si qq un à une solution je suis preneur :)
Arnaud écrit:

surtout avec autant de pipeline et de foreach imbriqués
...
Peut-être serait-il plus simple d'en faire une belle fonction ?

Bha justement sous PowerShell on code soit de maniére classique (procédural/Objet) soit avec à la PowerShell, c'est à dire un usage intensif du pipe.
L'utilisation de raccourci et d'imbrication donne un aspect ésotérique au code, mais ce n'est qu'une impression.

Pour moi le pipe n'est qu'une représentation à plat d'un code \"classique\" mais c'est vrai qu'on y perd en lisibilité car il devient dense.
Faut que je prenne l'habitude de l'écrire sur plusieurs lignes...
Arnaud écrit:

Qu'est ce qui te pose problème ?

La persistence de la variable de travail $Résult une fois le code exécuté.Bon en attendant mieux j'utilise Remove-Variable. J'ai essayé sans succès l'usage d'instruction de portée, d'où l'usage du scriptblock ou d'une fonction. Je pensais à tort que le pipeline créait implicitement une portée.

Puisque le pipeline manipule une collection d'objet sous forme de tableaux, je ne pense pas qu'il soit possible de récupérer une hastable de maniére simple.

J'ai essayé ceci :
[code:1]@{}|Foreach {($_).\"test\"=\"ok\";$_}[/code:1]
Cela fonctionne mais je n'ai pas encore pris le temp de voir comment l'insérer dans le code précédent.

[edit]
Si la dernière instruction peut être un foreach-object alors ceci fonctionne :
[code:1]
$Ht=dir |Where-Object {$_.PSIsContainer -eq 0}|% {$Result=@{}} {$Result.($_.Name)=$_} {$Result;Remove-Variable Result}
$Ht[\"NomDeFichier\"]
$Ht[\"NomDeFichier\"].LastWriteTime
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 15/06/08 19:02

Tutoriels PowerShell

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

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