none
Erreur Impossible d'indexer dans un objet de type System.Management.Automation.PSObject RRS feed

  • 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

    jeudi 16 janvier 2014 16:47

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.


    vendredi 17 janvier 2014 18:53
    Modérateur

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
    jeudi 16 janvier 2014 19:40
    Modérateur
  • 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
    vendredi 17 janvier 2014 12:50
  • 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.

    vendredi 17 janvier 2014 13:27
    Modérateur
  • Je ne suis pas certain comment corriger mon erreur? je doit faire un cast de $info?

    Est-ce possible de me montrer?

    vendredi 17 janvier 2014 17:33
  • 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.


    vendredi 17 janvier 2014 18:53
    Modérateur
  • Merci beaucoup de ton aide
    lundi 20 janvier 2014 12:09