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 :

Recupération de données dans une variable depuis Receive-job [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Recupération de données dans une variable depuis Receive-job
    Bonjour,

    Afin de faire de la supervision de serveurs, j'utilise deux scripts Powershell.
    Le premier "toto.ps1" permet d'afficher des données récupérer sur un serveur passé en paramètres.
    Celui-ci affiche les données à intervalle régulier à l'aide du commande write-host

    Le deuxième script "titi.ps1" lance une serie de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $list | ForEach-Object -process {start-job .\toto.ps1 -argumentlist $_.computername}
    j'utilise dans le script "titi.ps1" la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $message=(receive-job $numjob)
    Le résultat s'affiche à l'écran et ma variable $message reste vide.

    Quelqu'un pourrait il m'indiquer comment récupérer mes valeurs dans la variable $message sans les affichées ?

    Merci

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    J'ai trouvé la solution, mais je suis confronté à un autre problème.

    La solution :
    Dans mon script toto.ps1 j'ai remplacé le write-host par une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Avant :
    Write-host "message"
    
    Après :
    $message = "message"
    $message
    Maintenant le problème viens du fait que le temps de rafraichissement du script titi.ps1 est plus long que celui de toto.ps1

    ce qui provoque parfois que la variable $message devient un array de deux message (ex $message = "bonjour","coucou")

    Lors que je teste $message.length celui-ci me retoune soit la taille de la chaine de caractère s'il n'y a qu'un message, soit la taille de l'array.

    Comment faire pour pouvoir les différencier ?

  3. #3
    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,
    Citation Envoyé par Striper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $message=(receive-job $numjob)
    Le résultat s'affiche à l'écran et ma variable $message reste vide.
    Tu as peut être un premier appel à Receive-job dans le script principal(titi.ps1) ?
    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $Job=Start-Job {1..5}
    sleep 1
    $Message=(receive-job $job.id)
    Write-warning "message="
    $Message
    remove-job $Job
    Citation Envoyé par Striper
    Le premier "toto.ps1" permet d'afficher des données
    Le pb est peut être ici, pour que receive-job fonctionne les données doivent être émisent dans le pipeline, mais pas affichées à l'écran.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $job=Start-Job {1..5|write-host -fore green}
    sleep 1
    $Message=(receive-job $job.id)
    Write-warning "message="
    $Message
    remove-job $Job
    Mais sans le code des 2 scripts difficile de répondre...

    [edit]
    Je rédigais ma réponse lors de ton second post...

  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 Striper
    Comment faire pour pouvoir les différencier ?
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $Message -is [System.Collections.IEnumerable]
    Ainsi tu testes tous les types de collections et pas seulement les tableaux.

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    J'ai testé et cela ne marche pas. Peut-être que je l'utilise mal.

    Voici les scripts à l'heure actuelle :

    toto.ps1

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    param ($computer,$log,$nblog)
    
    $fin = get-date
    $fin = $fin.addhours(-$fin.hour)
    $fin = $fin.addminutes(-$fin.minute)
    $fin = $fin.addseconds(-$fin.second)
    $fin = $fin.addmilliseconds(-$fin.millisecond)
    $deb = $fin.adddays(-1)
    
    $message = " Taille : " + 0 
    $message
    
    $a = get-eventlog -computername $computer -logname $log -newest $nblog -before $fin
    
    $message = " Taille : " + ($a.length)
    $message
    
    
    while ($a[$a.length -1].timegenerated -gt $deb) {
      $a+= get-eventlog -computername $computer -logname $log -newest $nblog -before $a[-1].timegenerated.addmilliseconds(1)
      $message = " Taille : " + ($a.length)
      $message
    }
    
    $tempsdeb = get-date
    $message = "Exportation en cours " +($a.length)+ " enregistrements"
    $message
    
    $csv = "d:\personnel\" + $log + $computer + ".csv"
    
    $a | sort -property index -unique -descending | where {$_.timegenerated -ge $deb} | select eventid,machinename,index,entrytype,message,source,instanceid,timegenerated,username |export-csv $csv -encoding unicode
    $tempsfin = get-date
    $varunique = ($a | sort index -unique| where {$_.timegenerated -ge $deb}).length
    
    $message = "Temps : " + ([math]::round(($tempsfin - $tempsdeb).totalseconds,2)) + "s. Nb enr util : " + $varunique + " Soit : " + ([math]::round((($tempsfin - $tempsdeb).totalseconds/$varunique),2)) + " s/enrg"
    $message
    titi.ps1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $toto = import-csv .\listcomputer.csv 
    
    $toto | ForEach-Object -process {$_.numjob=(start-job .\toto.ps1 -argumentlist $_.computername,$_.logname,$_.nblog).id}
    
    do {
      cls
      $toto | foreach-object -process {
        $_.state=(get-job $_.numjob).state
        $temp=(receive-job $_.numjob)
    	if ($temp -ne $null) {if ($temp -is [System.collections.IEnumerable]) {$_.message=$temp[-1]} else {$_.message=$temp}}
      }  
      $toto
      start-sleep 1
    } while ( (get-job |group state | where {$_.name -eq "Running"}).count -ne $null )

    En fait, le retour que j'obtiens est toujours de type [System.String]
    Soit avec un message comme :
    $toto = "Taille 10"
    soit avec plusieurs message comme
    $toto = "Taille 10","Taille 20","Taille 30"

    En donc dans le premier cas j'obtiens pour $toto[-1] = "0" ou "Taille 30" dans le deuxieme cas

  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 Striper
    Peut-être que je l'utilise mal.
    Non, le pb est dans le test de la valeur de retour, car les opérateurs -eq -ne se comportent différemment avec un tableau .
    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
    $res="string"
    $res -eq $null
    #renvoi False
     
    $res=1..5
    $res -eq 2
    #renvoi 2
    $res -ne 2
    #renvoi 1,3,4,5
     
    $res -eq $null
    #RAS, aucune valeur, le tableau ne contient d'élément $null
    $res=@(1,2,$null)
    $res -eq $null
    #RAS
    $res -contains $null
    #true
     
    $res=$null
    $res.psbase -eq $null
    #renvoi True
    Utilise psbase pour tester la nullité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $temp=(receive-job $_.numjob)
    if ($temp.psbase -ne $null)

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Ok merci ca fonctionne

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

Discussions similaires

  1. recupération de donneés dans une variable
    Par youness_ka dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/08/2007, 16h18
  2. envoie de donnée dans une requéte depuis un liste déroulante
    Par steve o'steen dans le forum Langage
    Réponses: 1
    Dernier message: 17/10/2006, 16h24
  3. lire une donnée dans une variable de session
    Par pblb62 dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2006, 14h23
  4. [VB.NET] lien d'une base de donnée dans une variable
    Par Anubis666 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/01/2006, 10h56
  5. Réponses: 2
    Dernier message: 14/10/2005, 10h11

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