IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Variable en sortie d'Invoke-Command [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Variable en sortie d'Invoke-Command
    Bonjour,

    Je souhaite pouvoir récupérer le ou les résultats des différentes commandes lancés dans invoke-command, je ne trouve pas comment faire.
    Pour commencer simplement, comment puis je récupérer la valeur $Jeton à la sortie d' invoke-command qui passe de 0 à 1 ou 2 en fonction de la présence du fichier ou non?

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $OldServer           = "Comput1" 
    $VM_Nom             = "Comput2"
    $Jeton                  = "0"
    $BizInI                  = "D:\applicat\prog\bizerba\BIZTRACK\biztrack.ini"
    $pattern                = "NOM_SERVEUR_FICHIER_HF_CS=$OldServer"
    $pattern1              = "NOM_SERVEUR_FICHIER_HF_CS=$VM_Nom"
    
    $Biz                     =  Invoke-Command -session $RemoteSession -scriptblock {
    
            param( $VM_Nom, $OldServer,  $BizInI, $Jeton, $pattern, $pattern1 )
    
           If ( !( Test-Path $BizInI ) ) 
           {
             Write-Host "Le fichier Biztrack.ini est innaccessible ou inexistant" -ForegroundColor Red
             Write-Host  "Arrêt du script"
             $Jeton                = "2"
             Exit
           }
       Else    
           {
             Write-Host "Modification du champs NOM_SERVEUR du fichier Biztrack.ini" -ForegroundColor Green
             ( ( Get-Content $BizInI ).Replace( $pattern, $pattern1 ) ) | Set-Content $BizInI
             $Jeton                = "1"
           }
     } -ArgumentList ( $VM_Nom, $OldServer, $BizInI, $Jeton,  $pattern, $pattern1 )

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    PS étant basé sur le pipeline utilise la cmdlet Write-Output qui écrit la donnée dans le pipeline :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      #Soit directement
     Write-Output 2
       #Soit indirectement
     Write-Output $Jeton
    Rappel :
    Dans ce cas les objets sont sérialisés, avec certains types on peut ne pas retrouver leur type d'origine. Ici pas de pb.
    L'imbrication d'objet peut quelque fois nécessiter de modifier la profondeur de sérialisation.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Rebonjour,

    Merci de votre aide mais une fois mon script terminé et que je tape $jeton, la valeur n'a pas changé.
    En gros votre proposition ne fonctionne pas.
    Avez vous une autre idée svp ou peut être que soit je fait mal soit j'ai mal expliqué mon pb?

    En résumé
    1-J'ai un script qui utilise invoke-command pour executer des commandes sur un serveur distant
    2-j'ai une variable qui est à 0
    3-je lance invoke-command -scriptblock{}
    4-la variable est modifié dans invoke-command
    5-je veux récupérer dans mon script ce nouvel état de la variable une fois invoke-command terminé et pouvoir l'utiliser et le manipuler

    merci d'avance

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lavocatb Voir le message
    soit j'ai mal expliqué mon pb?
    Tu indiquais :
    Citation Envoyé par lavocatb Voir le message
    ...récupérer la valeur $Jeton à la sortie d' invoke-command...
    Essaie ceci :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $Jeton= Invoke-Command...
    Citation Envoyé par lavocatb Voir le message
    4-la variable est modifié dans invoke-command
    Non, Invoke-Command renvoie une valeur, un objet. Ce n'est pas la même variable car le code appelant et celui appelé utilise des contextes différents qui ne partage aucune donnée.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Si je comprends bien, il n'est pas possible de récupérer différents résultats à la sortie de invoke-command -Scriptblock{} ?
    On peut injecter des variables via Param($var1, $var2) et -ArgumentList($var1, $var2) dans invoke-command mais pas l'inverse?

    Si c'est le cas je suis bien embêté.

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lavocatb Voir le message
    Si je comprends bien, il n'est pas possible de récupérer différents résultats à la sortie de invoke-command -Scriptblock{} ?
    Si.
    Tu peux récupérer une collection d'objets, dans le cas où tu récupères 3 objets (désérialisés) c'est à toi de définir à quelle variable tu les affectes:
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $Tableau=Invoke-commande {...}
    $MaVariable1=$Tableau[0]
    $MaVariable2=$Tableau[1]
    $MaVariable3=$Tableau[2]

    Citation Envoyé par lavocatb Voir le message
    On peut injecter des variables via Param($var1, $var2) et -ArgumentList($var1, $var2) dans invoke-command mais pas l'inverse?
    Oui, on paramètre un job et on récupère un résultat constitué d'un ou plusieurs objets.
    Ici un job crée un autre process windows qui à son tour crée une autre instance du runtime Powershell, c'est donc cloisonner.
    Ensuite l'échange de donnée entre les 2 process utilise la sérialisation.
    Tu trouveras d'autres infos dans le tutoriel sur le jobs.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Rebonjour,

    Quelque chose m'échappe semble t'il, je précise que je suis débutant en powershell.

    J'ai regardé tes infos sur les jobs et je récupére des jobs mais j'en fait quoi?
    peux tu me montrer stp un exemple soit à partir de mon bout de script soit avec un exemple simple?

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lavocatb Voir le message
    Rebonjour,
    Quelque chose m'échappe semble t'il ...
    Le temps peut être
    Citation Envoyé par lavocatb Voir le message
    J'ai regardé tes infos sur les jobs et je récupère des jobs mais j'en fait quoi?
    Non, la mécanique interne à Invoke-Command est basée sur un job, mais elle ne renvoie pas de job, comme son nom l'indique elle exécute une commande et renvoi le résultat.
    Sauf si on précise le paramètre Invoke-Command -AsJob, dans ce cas elle renvoi un job. Ensuite on doit utiliser le cmdlet Receive-Job pour récupérer le résultat.

    Ton exemple (à tester ) :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    $OldServer = "Comput1" 
    $VM_Nom   = "Comput2"
    [int]$Jeton  = 0
    $BizInI   = "D:\applicat\prog\bizerba\BIZTRACK\biztrack.ini"
    $pattern  = "NOM_SERVEUR_FICHIER_HF_CS=$OldServer"
    $pattern1 = "NOM_SERVEUR_FICHIER_HF_CS=$VM_Nom"
     
    $Jeton= Invoke-Command -session $RemoteSession -ArgumentList $VM_Nom, $OldServer, $BizInI, $Jeton, $pattern, $pattern1 -scriptblock {
      param( $VM_Nom, $OldServer,  $BizInI, $Jeton, $pattern, $pattern1 )
     
      If (!( Test-Path $BizInI ) ) 
      {
        Write-Error "Le fichier Biztrack.ini est inaccessible ou inexistant" -ForegroundColor 
        Write-Output 2
      }
      Else    
      {
        Write-Verbose "Modification du champs NOM_SERVEUR du fichier Biztrack.ini" -ForegroundColor Green
        (Get-Content $BizInI).Replace($pattern, $pattern1) | Set-Content $BizInI
        Write-Output 1
      }
    }
    Test avec un appel renvoyant plusieurs valeurs :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $Jeton=5
    $Tab= Invoke-Command -computer localhost -ArgumentList $Jeton -scriptblock {
      param( $Jeton )
     
      Write-Output ($Jeton * 2)
      Write-Output ($Jeton * 3)
      Write-Output ($Jeton * 4)
    } 
    $Tab
    Réécriture du précédent test :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $Dix=$Quinze=$Vingt=$PlusDeDonnée=-1  #Initialisation multiple, tous ont la même valeur
    Write-host "Dix:$Dix - Quinze:$Quinze - Vingt:$Vingt -PlusDeDonnée:$PlusDeDonnée"
     
    #Affectation multiple à partir de la collection renvoyée par l'appel à Invoke-Command
    $Dix,$Quinze,$Vingt,$PlusDeDonnée= Invoke-Command -computer localhost -ArgumentList $Jeton -scriptblock {
      param( $Jeton )
     
      Write-Output ($Jeton * 2)  #Première valeur renvoyée elle est affectée à la variable $Dix déclaré dans le script appelant
      Write-Output ($Jeton * 3)  #Seconde valeur renvoyée elle est affectée à la variable $Quinze ...
      Write-Output ($Jeton * 4)  #...
    } 
    Write-host "Dix:$Dix - Quinze:$Quinze - Vingt:$Vingt"
    $null -eq $PlusDeDonnée   # Une collection de trois objets ne peut en renseigner quatre ;-)
    #True
    J'utilise peu cette dernière écriture ne sachant rarement le nombre d'objet renvoyé par mes traitements.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci pour les exemples, je test et te dit.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup Laurent, je parviens à récupérer ce qui m'intéresse c'est génial.

    Encore merci et je vais de ce pas reposter une discussion.
    Quand un pb est résolu un nouveau pointe souvent le début de son nez.

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lavocatb Voir le message
    Quand un pb est résolu un nouveau pointe souvent le début de son nez.
    Je confirme !

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Je reviens à la charge concernant ma question sur ce qu'il est possible de prendre en sortie d'une commande invoke-command.
    Je ne sais pas ce que j'avais réussi à faire la dernière fois mais en fait je n'y parviens pas, j'ai refait les exemples qui m'ont été porésentés mais rien ne fonctionne.

    Pourriez vous me réexpliquer avec exemple car les exemples précédents ne fonctionnent pas.

    En rappel :
    Je dois enchainer des scripts.
    Les scripts travaillent en remote et utilise invoke-command pour travailler sur des serveurs distants.
    En fonction de la réussite des actions entreprises dans invoke-command
    Je veux récupérer un résultat simple qui serait 1 ou 0 pour commencer.
    Ce résultat me servirait à soit lancer le prochain script soit stopper.

    Je reprends l'exemple qui m'a été donné et si je comprends bien $Tab est censé me renvoyer un résultat?
    Mais lequel? Car je ne vois pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $Jeton=5
    $Tab= Invoke-Command -computer localhost -ArgumentList $Jeton -scriptblock {
      param( $Jeton )
     
      Write-Output ($Jeton * 2)
      Write-Output ($Jeton * 3)
      Write-Output ($Jeton * 4)
    } 
    $Tab
    voila et merci d'avance.

    Bruno

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Sortie de nombre et de texte depuis invoke-command
    Par lavocatb dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 07/10/2016, 17h08
  2. [PowerShell] Utiliser une variable dans un scriptblock de la commande Invoke-command
    Par arnaudperfect dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 20/07/2015, 14h40
  3. [Batch] Rediriger la sortie d'une commande vers une variable
    Par Merwyn dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 28/09/2012, 17h30
  4. Réponses: 8
    Dernier message: 19/09/2007, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo