none
Comment Envoyer et reçevoir une Hashtable dans un script PowerShell ? RRS feed

  • Question

  • J'ai une hashtable contenant ("nomdemaVM","IPdemaVM" ...etc) et j'essaie de la transmettre dans un autre script. 

    j'envoie les données avec 

    powershell.exe $path $InfoVM (où InfoVM est la table de Hashage)

    Le problème est que la liste reçue est vide :

    ```powershell.exe : Indexation impossible dans un tableau Null.```

    la seule chose qui fonctionne est la déclaration d'une quantité multiple de variables où chaque paire de valeur prend respectivement la clé et la valeur d'une paire de la hashtable

    param($1,$2,$3,$4,$5,$6)

    ($1="nomdemaVM", $2="IPdemaVM")

    Le problème c'est que je ne sais pas combien de paire (nomvm,IPvm) j'aurais dans le futur et je ne veux pas m'amuser à rajouter un nombre toujours plus conséquent de variables comme $1,$2 ...etc

    auriez vous une solution pour recevoir directement la hashtable ? 

    PS : J'ai essayé avec param([hashtable]$1) mais je reçois l'erreur suivante : 

    ```
    paramŠtre ®1¯. Impossible de convertir la valeur ®System.Collections.Hashtable¯ du type ®System.String¯ en type ®
    System.Collections.Hashtable¯.

    ```

    merci d'avance 

    Cordialement

    jeudi 21 janvier 2021 11:23

Réponses

  • Bonjour lcsd

    Tu ne nous dis pas comment tu t'y prends pour passer de script1 à script2.

    J'ai 2 petits scripts

    Script2

    Write-Host " Les info dans la var HasTable sont les suivantes" -foregroundColor green
    $HashTable

    Comme tu le vois, ce second script ne contient pas grand chose, juste un Write-Host d'une variable

    Script1

    $hashTable = @{
      “NomVM” = “value1”
      “IPVM” = “value2”
     }
     # Appel de script2 "dot sourced"
    . C:\temp2\script2.ps1

    Dans mon script1, j'ai une HashTable. Ce script appelle script2 et cela donne

     C:\Temp2\script1.ps1
     Les info dans la var HasTable sont les suivantes
    
    Name                           Value                                                                                                                  
    ----                           -----                                                                                                                  
    IPVM                           value2                                                                                                                 
    NomVM                          value1  

    Ma variable est bien passé du premier au second script.Je pense que ton pb vient de ce qu'on appelle le scope des variables. Jettes un oeil sur cet article qui parle  des étendues (scope) et de l"héritage des étendues.

    https://adamtheautomator.com/powershell-scopes/

    Cela fonctionne dans mon cas, car c'est script1 qui appelle script2 ... et héritage patati, patata.

    Je ferme mon shell, et j'en ouvre un tout frais. Je lance script2 et naturellement il ne connait pas $HashTable.

    Et si je reprend mon premier exemple. Je lance script1 (mais sans appeler script2), puis j'ouvre dans ce même shell, je lance script2 ===> il connait ma variable car je suis dans la même instance du shell. 

    j'espère que cela t'éclairera

    Ton pb n'est pas tant lié au fait que cela soit une HashTable, mais une variable que tu veux transférer  d'un script à un autre.

    Et si les 2 scripts doivent s'exécuter séparément ?

    Export dans un fichier par le 1er et réimport dans le second.

    cordialement

    Olivier


    • Modifié Oliv - TheFrog jeudi 21 janvier 2021 13:33
    • Marqué comme réponse Lcsd vendredi 22 janvier 2021 08:56
    jeudi 21 janvier 2021 13:29

Toutes les réponses

  • Bonjour lcsd

    Tu ne nous dis pas comment tu t'y prends pour passer de script1 à script2.

    J'ai 2 petits scripts

    Script2

    Write-Host " Les info dans la var HasTable sont les suivantes" -foregroundColor green
    $HashTable

    Comme tu le vois, ce second script ne contient pas grand chose, juste un Write-Host d'une variable

    Script1

    $hashTable = @{
      “NomVM” = “value1”
      “IPVM” = “value2”
     }
     # Appel de script2 "dot sourced"
    . C:\temp2\script2.ps1

    Dans mon script1, j'ai une HashTable. Ce script appelle script2 et cela donne

     C:\Temp2\script1.ps1
     Les info dans la var HasTable sont les suivantes
    
    Name                           Value                                                                                                                  
    ----                           -----                                                                                                                  
    IPVM                           value2                                                                                                                 
    NomVM                          value1  

    Ma variable est bien passé du premier au second script.Je pense que ton pb vient de ce qu'on appelle le scope des variables. Jettes un oeil sur cet article qui parle  des étendues (scope) et de l"héritage des étendues.

    https://adamtheautomator.com/powershell-scopes/

    Cela fonctionne dans mon cas, car c'est script1 qui appelle script2 ... et héritage patati, patata.

    Je ferme mon shell, et j'en ouvre un tout frais. Je lance script2 et naturellement il ne connait pas $HashTable.

    Et si je reprend mon premier exemple. Je lance script1 (mais sans appeler script2), puis j'ouvre dans ce même shell, je lance script2 ===> il connait ma variable car je suis dans la même instance du shell. 

    j'espère que cela t'éclairera

    Ton pb n'est pas tant lié au fait que cela soit une HashTable, mais une variable que tu veux transférer  d'un script à un autre.

    Et si les 2 scripts doivent s'exécuter séparément ?

    Export dans un fichier par le 1er et réimport dans le second.

    cordialement

    Olivier


    • Modifié Oliv - TheFrog jeudi 21 janvier 2021 13:33
    • Marqué comme réponse Lcsd vendredi 22 janvier 2021 08:56
    jeudi 21 janvier 2021 13:29
  • bonsoir
    la question de savoir d'où "vient" le hastable à l'origine est pertinente. et pourquoi appeler le powershell.exe  pour lancer une autre script ?

    Un exemple qui fonctionne

    function New-HT {
       # creation du HashTable
        $TheHastTable=@{} 

        $TheHastTable['V1']='valeur 1'
        $TheHastTable['V2']='valeur 2'
        $TheHastTable['V3']='valeur 3'
        return [hashtable]$TheHastTable
    }

    Function Show-HT {
        # exploitation du hastTable
        param(
            [parameter(Mandatory=$True)][hashtable]$HT
        )
        foreach ($Item in ($HT.GetEnumerator())) {
            Write-host -NoNewline $Item.name 
            Write-host -NoNewline ' : ' 
            Write-host  $Item.value
        }
    }

    # appel des fonctions
    $W=New-HT
    Show-HT -HT $W 
    jeudi 21 janvier 2021 17:32
  • Peu importe les exemple données par F. Dunoyer et moi-même, ils sont tout les 2 valables. Le point principal à retenir est le suivant : l'appel dans un script d'un script externe ou de fonctions externes doit se faire en "dot-sourçant " (traduction littéral de "dot-sourcing") les fichiers

    Ref : https://docs.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_scripts?view=powershell-7.1

    Cordialement

    Olivier

    vendredi 22 janvier 2021 07:53
  • Effectivement, 

    Encore merci j'ai beaucoup appris, je suis encore débutant en Powershell et le problème venait de la façon dont je faisais appel à un autre script en ouvrant une autre fenêtre Powershell. 

    Le problème n'était pas tant la Hashtable mais cette nouvelle fenêtre.

    Mon problème est résolu

    Merci

    Cordialement 

    vendredi 22 janvier 2021 08:56