Idée
Hashtable
- michault
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 128
- Remerciements reçus 0
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
ça fonctionne.$polling | Add-Member NoteProperty StatusImprimante2 $printerstatustab[3]
HELP!
Merci
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
chm69 écrit:
Peut être en goupant le code associé au nouveau membre :si je mets en dur
ça fonctionne.$polling | Add-Member NoteProperty StatusImprimante2 $printerstatustab[3]
[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
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.
- michault
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 128
- Remerciements reçus 0
$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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
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 le passthru, qu'est ce que ça apporte?
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.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
- Messages : 576
- Remerciements reçus 0
[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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Si je comprend bien, tu préconises n appels à Add-Member au lieu d'utilser le pipeline ?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.
janel écrit:
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.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.
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=@(\"un\",\"deux\",\"trois\"«»)
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=@(\"un\",\"deux\",\"trois\"«»)
#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=@(\"un\",\"deux\",\"trois\"«»)
#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
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Hashtable