Question Pipeline et mémorisation dans une hastable
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 15 ans 10 mois #2349
par Laurent Dardenne
Tutoriels PowerShell
Pipeline et mémorisation dans une hastable a été créé 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
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.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 15 ans 10 mois #2358
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:Pipeline et mémorisation dans une hastable
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...
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 ?
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.
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...
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.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 15 ans 10 mois #2361
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Pipeline et mémorisation dans une hastable
Salut,
Arnaud écrit:
[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:
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:
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
Arnaud écrit:
Oui désolé, j'ai oublié de commenterJe 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,
[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:
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.surtout avec autant de pipeline et de foreach imbriqués
...
Peut-être serait-il plus simple d'en faire une belle fonction ?
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:
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.Qu'est ce qui te pose problème ?
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
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- Pipeline et mémorisation dans une hastable