Meilleur auteur de réponses
Erreur Impossible d'indexer dans un objet de type System.Management.Automation.PSObject

Question
-
Bonjour,
Je ne m'explique pas pourquoi le code suivant s'exécute correctement (Psobject avec plusieurs entrées)
$Info = @() $obj = new-object PSObject -prop @{Manufacturier = "a" ; Produit = "b"; NumeroSerie = "c" } $Info += $obj $obj2 = new-object PSObject -prop @{Manufacturier = "d" ; Produit = "e"; NumeroSerie = "f" } $Info += $obj2 $cntEcrans = $Info | measure for ($a = 0;$a -le $cntEcrans.count -1;$a++) { $item = New-Object System.Windows.Forms.ListViewItem($Info[$a].Manufacturier) $item.SubItems.Add($Info[$a].Produit) $item.SubItems.Add($Info[$a].NumeroSerie) }
Mais celui-ci (PsObject avec une entrée) me sort une erreur:
$obj = new-object PSObject -prop @{Manufacturier = "a" ; Produit = "b"; NumeroSerie = "c" } $cntEcrans = $obj | measure for ($a = 0;$a -le $cntEcrans.count -1;$a++) { $item = New-Object System.Windows.Forms.ListViewItem($obj[$a].Manufacturier) $item.SubItems.Add($obj[$a].Produit) $item.SubItems.Add($obj[$a].NumeroSerie) }
Erreur:
Impossible d'indexer dans un objet de type System.Management.Automation.PSObject.
Au niveau de H:\PowerShell\Mes_PowerShell\a enlever.ps1 : 9 Caractère : 71
+ $item = New-Object System.Windows.Forms.ListViewItem($obj[ <<<< $a].Manufacturier)
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
Réponses
-
je doit faire un cast de $info?
Sans connaitre le contexte et de ce que je comprends de ton code, ma réponse est oui.
[PSObject[]]$Info = @() $obj = new-object PSObject -prop @{Manufacturier = "a" ; Produit = "b"; NumeroSerie = "c" } #Ajoute deux éléments $Info += $obj $Info += $obj $Info[0].Manufacturier $obj = new-object PSObject -prop @{Manufacturier = "e" ; Produit = "f"; NumeroSerie = "g" } #Réaffecte un nouveau tableau d'un élément $Info = $obj $Info[0].Manufacturier
La première ligne reste compréhensible de prime abord.
Beatus, qui prodest, quibus potest.
- Modifié Dardenne LaurentMVP, Moderator vendredi 17 janvier 2014 18:53 Coquille
- Proposé comme réponse Dan BajenaruMicrosoft employee lundi 20 janvier 2014 16:10
- Marqué comme réponse Marc LognoulModerator lundi 20 janvier 2014 18:59
Toutes les réponses
-
Bonjour,
peut être une confusion entre les variable $Infos (un tableau) et $obj (un PSObject) ?
Un PSObject ne peut être indexé à moins que la classe adaptée implémente un indexeur :
$ZipContent = [Ionic.Zip.ZipFile]::Read("$pwd\PsIonicSetup.zip") $ZipContent["PsIonic/Ionic.Zip.dll"] # # LastModified Size CompressedSize Ratio Encrypted Crc Name # ------------ ---- -------------- ----- --------- --- ---- # 01/03/2013 20:53:40 492032 286476 42% False 1ABCF537 PsIonic/Ionic.Zip.d
Beatus, qui prodest, quibus potest.
Tutoriel Powershell- Modifié Dardenne LaurentMVP, Moderator vendredi 17 janvier 2014 10:23
-
Si je fait ceci:
$Info = @() $obj = new-object PSObject -prop @{Manufacturier = "a" ; Produit = "b"; NumeroSerie = "c" } $cntEcrans = $obj | measure $Info = $obj for ($a = 0;$a -le $cntEcrans.count -1;$a++) { $item = New-Object System.Windows.Forms.ListViewItem($Info[$a].Manufacturier) $item.SubItems.Add($Info[$a].Produit) $item.SubItems.Add($Info[$a].NumeroSerie) }
j'obtiens la même erreur bien que j'indexe dans un array -
j'obtiens la même erreur bien que j'indexe dans un array
Dans ton cas $Infos n'est pas un tableau, tu as deux références sur le même objet :
$Info = $obj $Info.GetType() # IsPublic IsSerial Name BaseType # -------- -------- ---- -------- # True False PSCustomObject System.Object $Info = @($obj) $Info.GetType() # IsPublic IsSerial Name BaseType # -------- -------- ---- -------- # True True Object[] System.Array $Info = $obj -as [system.Array] $Info.GetType() # IsPublic IsSerial Name BaseType # -------- -------- ---- -------- # True True Object[] System.Array [PSObject[]]$Info = $obj $Info.GetType() # IsPublic IsSerial Name BaseType # -------- -------- ---- -------- # True True PSObject[] System.Array
Dans le dernier exemple, la variable est contrainte sur le type, ce qui fait que l'affectation réussie:
Trace-Command TypeConversion {[PSObject[]]$Info =$obj,} -PSHost
Beatus, qui prodest, quibus potest.
-
-
je doit faire un cast de $info?
Sans connaitre le contexte et de ce que je comprends de ton code, ma réponse est oui.
[PSObject[]]$Info = @() $obj = new-object PSObject -prop @{Manufacturier = "a" ; Produit = "b"; NumeroSerie = "c" } #Ajoute deux éléments $Info += $obj $Info += $obj $Info[0].Manufacturier $obj = new-object PSObject -prop @{Manufacturier = "e" ; Produit = "f"; NumeroSerie = "g" } #Réaffecte un nouveau tableau d'un élément $Info = $obj $Info[0].Manufacturier
La première ligne reste compréhensible de prime abord.
Beatus, qui prodest, quibus potest.
- Modifié Dardenne LaurentMVP, Moderator vendredi 17 janvier 2014 18:53 Coquille
- Proposé comme réponse Dan BajenaruMicrosoft employee lundi 20 janvier 2014 16:10
- Marqué comme réponse Marc LognoulModerator lundi 20 janvier 2014 18:59
-