Idée Hashtable

Plus d'informations
il y a 17 ans 1 mois #3930 par michault
Hashtable a été créé par michault
Bonjour,

Encore une question de débutant:blush:

Voilà mon bout de script:

[code:1]$computer = '.'
$polling = New-Object PSObject

$bios = Get-WmiObject win32_bios -ComputerName $computer
$network = Get-WmiObject win32_networkadapterconfiguration -ComputerName $computer | where {$_.IPEnabled -eq 'True'}
$logicaldisk = Get-WmiObject win32_logicaldisk -ComputerName $computer | where {$_.DriveType -eq 3}
$printer = get-wmiobject win32_printer | where {$_.default -eq $true}
$printerstatustab =@{1 = \"Autre\"; 2 = \"Inconnu\"; 3 = \"Veille\"; 4 = \"En cours d'impression\";`
5 = \"En cours de démarrage\"; 6 = \"Impression intérrompue\"; 7 = \"Hors connexion\"}
$printerstatustab

$polling | Add-Member NoteProperty Serie $bios.serialnumber
$polling | Add-Member NoteProperty Ip $($network.ipaddress)
$polling | Add-Member NoteProperty Mac $network.macaddress
$polling | Add-Member NoteProperty Freespace $([Math]::Round($logicaldisk.freespace/1GB,1))
$polling | Add-Member NoteProperty Taille $([Math]::Round($logicaldisk.size/1GB,1))
$polling | Add-Member NoteProperty Imprimante $printer.name
$polling | Add-Member NoteProperty StatusImprimante $printer.printerstatus
$polling | Add-Member NoteProperty StatusImprimante2 $printerstatustab.value | where {$printerstatus.name -eq $printer.printerstatus}
$polling | Add-Member NoteProperty PortImprimante $printer.portname

$polling | Out-Host | Format-Table[/code:1]

Je n'arrive pas à récupérer la valeur correspond au status de mon imprimante.
si je mets en dur

$polling | Add-Member NoteProperty StatusImprimante2 $printerstatustab[3]

ça fonctionne.
HELP!
Merci

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

Plus d'informations
il y a 17 ans 1 mois #3932 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Hashtable
Salut,
chm69 écrit:

si je mets en dur

$polling | Add-Member NoteProperty StatusImprimante2 $printerstatustab[3]

ça fonctionne.

Peut être en goupant le code associé au nouveau membre :
[code:1]polling | Add-Member NoteProperty StatusImprimante2 ($printerstatustab.value | where {$printerstatus.name -eq $printer.printerstatus})[/code:1]
Mais je ne sais pas si ce code est un second pipeline ou fait partie du premier :S

En passant, tu peux utiliser la paramètre passthru du cmdlet Add-Member:
[code:1]
$polling | Add-Member NoteProperty Serie $bios.serialnumber -passthru|`
Add-Member NoteProperty Ip $($network.ipaddress)-pass|`
Add-Member NoteProperty Mac $network.macaddress -pass|`
...
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 17 ans 1 mois #3933 par michault
Réponse de michault sur le sujet Re:Hashtable
j'avais aussi essayé çà

$polling | Add-Member NoteProperty StatusImprimante2 ($printerstatustab.value | where {$printerstatustab.name -eq $printer.printerstatus})


mais ça me renvoie une ligne blanche.

Pour le passthru, qu'est ce que ça apporte?

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

Plus d'informations
il y a 17 ans 1 mois #3935 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Hashtable
chm69 écrit:

Pour le passthru, qu'est ce que ça apporte?

Tu utilises un seul pipe au lieu de n pipes, à chaque fois tu exécutes une initialisation c'est donc moins rapide. Et cela fait un peu moins de saisie mais sinon le résultat est identique.
Pour ton problème, le type de la propriété est un entier non signé UInt16.
Il faut donc caster la valeur puisque par défaut PS considére les nombres non flottant comme des entiers Int32 :
[code:1]$polling | Add-Member NoteProperty StatusImprimante2 $printerstatustab[[int]$printer.printerstatus][/code:1]
A moins de caster directement le tableau :
[code:1]$printerstatustab =@{[UInt16]1 = \"Autre\";
...
$polling | Add-Member NoteProperty StatusImprimante2 $printerstatustab[$printer.printerstatus][/code:1]<br><br>Message édité par: Laurent Dardenne, à: 4/02/09 14:42

Tutoriels PowerShell

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

Plus d'informations
il y a 17 ans 1 mois #3945 par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Hashtable
Hormis ce problème de typage, je voulais juste signaler un usage plus recommandé de add-member que celui utilisé ici pour éviter des erreurs qui risqueraient d'être difficiles à déboguer :

[code:1]
add-member -in $polling NoteProperty StatusImprimante2 $printerstatustab[[int]$printer.printerstatus]
[/code:1]
La grosse différence, en dehors du gain de performance lié à la non utilisation du pipeline, tient au fait qu'on est sûr d'ajouter le membre sur l'objet $polling lui-même.

En effet, si $polling était une collection d'objets, la syntaxe utilisée au départ ajouterait le membre à chaque objet de la collection. Or, dans de nombreux cas on ne sait pas à priori si un objet sera une collection ou pas. Et même si le contenu de l'objet est connu à l'avance, on peut ne pas penser au fait qu'il s'agit d'une collection et donc se faire avoir.

Janel

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

Plus d'informations
il y a 17 ans 1 mois #3948 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Hashtable
janel écrit:

La grosse différence, en dehors du gain de performance lié à la non utilisation du pipeline, tient au fait qu'on est sûr d'ajouter le membre sur l'objet $polling lui-même.

Si je comprend bien, tu préconises n appels à Add-Member au lieu d'utilser le pipeline ?
janel écrit:

En effet, si $polling était une collection d'objets, la syntaxe utilisée au départ ajouterait le membre à chaque objet de la collection. Or, dans de nombreux cas on ne sait pas à priori si un objet sera une collection ou pas. Et même si le contenu de l'objet est connu à l'avance, on peut ne pas penser au fait qu'il s'agit d'une collection et donc se faire avoir.

Ici on sait que ce n'est pas le cas, mais sur le fait de se prémunir d'un possible effet de bord je suis tout à fait d'accord, cela fait un cas de plus à tester.
Par contre il y a un contexte particulier où cela peut se passer, il faut que la collection ait été préalablement adaptée par PowerShell car le cmdlet Add-member ne fonctionne que sur des instances de type PSObject.
[code:1]
remove-variable T
#Tableau d'objet
$T=@(\&quot;un\&quot;,\&quot;deux\&quot;,\&quot;trois\&quot;«»)
add-member -inputObject $T NoteProperty West 10 -pass
$T|Gm|Sort name
$T.West
#Adaptation de l'objet
$T.Count
#On modifie le tableau et pas les objets du tableau
add-member -inputObject $T NoteProperty West 10 -pass
$T.West
[/code:1]
Le premier appel ne fonctionne pas, à moins de caster en PSObject, mais le second oui.
Ensuite sur les objets du tableau :
[code:1]
remove-variable T
#Tableau d'objet
$T=@(\&quot;un\&quot;,\&quot;deux\&quot;,\&quot;trois\&quot;«»)
#On modifie les objets du tableau et pas le tableau
$T=$T|add-member NoteProperty West 10 -pass
$T|Gm|Sort name
$T[0].West
$T.West
[/code:1]
Si on type la collection le comportement n'est plus le même
[code:1]
remove-variable T
#Tableau de string
[string[]]$T=@(\&quot;un\&quot;,\&quot;deux\&quot;,\&quot;trois\&quot;«»)
#On modifie les objets du tableau et pas le tableau
$T=$T|add-member NoteProperty West 10 -pass
$T|Gm|Sort name
$T[0].West
$T.West
[/code:1]
C'est parfois un peu déroutant :blink:

Tutoriels PowerShell

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

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