Question
Start-Job et Variables
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
J'ai récemment écrit un script qui permet de récupérer plusieurs logs de plusieurs pc. ( ca fait beaucoup de chose à récupérer donc
Seulement Ce script met beaucoup de temps, ceci est principalement due au fait que je récupère les logs un par un.
J'ai donc décidé d'utiliser la Cmdlet \"Start-Job\" pour récupérer tous les logs en même temps.
Une fois les logs récupérés je les ajoutent dans un objet PSObject qui concentre tous les logs.
Une fois le traitement finit je récupère l'objet et je l'affiche dans une interface graphique.
Mais voilà je n'arrive pas à récupérer l'objet PSObject.
J'ai essayé de mettre l'objet en global mais ca ne marche pas(C'est due au fait que les sessions PS sont différentes je suppose).Je ne peut pas utiliser Invoke-Command car je doit afficher la variable dans une interface graphique.J'ai aussi regardé du coté des runspaces grâce au (magnifique) tutoriel de Laurent mais il me parait bien trop compliquer pour récupérer juste une variable.
J'ai sinon lus dans le tuto que Powershell v1 ne supporte pas nativement la création de thread à l'aide d’API dotnet, mais peut être que Powershell v2 le fait?
Bref quelqu'un aurait il une solution?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Je dirais que c'est le sujet qui est relativement complexe, et c'était plus une étude des problématiques liés aux runspaces.J'ai aussi regardé du coté des runspaces grâce au (magnifique) tutoriel de Laurent mais il me parait bien trop compliquer pour récupérer juste une variable.
Sinon on utilise une seule instruction voir ce post (dans un contexte session principale/Modules).
bilbao écrit:
Non, et je ne pense pas que cela soit le cas un jour.J'ai sinon lus dans le tuto que Powershell v1 ne supporte pas nativement la création de thread à l'aide d’API dotnet, mais peut être que Powershell v2 le fait?
bilbao écrit:
Le mieux est de nous proposer un script à minima reproduisant le problème que tu rencontres, avec juste un ou + producteurs et un consommateur (le contexte de log importe peu).Bref quelqu'un aurait il une solution ?
Si tu fais un Start-Job il faut utiliser Receive-Job, pas besoin d'adresser le runspace sous-jacent.
Schématiquement, on ne partage pas des données, mais on se \"connecte\" à des pipelines.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
De toute façon je vais taper un petit script illustrant mon problème comme tu me le conseil.
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
Il me reste donc à récupérer le résultat de chaque job.
La pièce jointe Recup_log.ps1 est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Ouai, mais un peu alors. Tu as attaqué le pb par la face nord, c'est pour çail est un peu difficile à comprendre(
) ,
Du coup faut un peu de temps pour le comprendre, tu pouvais aussi crée uniquement 2 jobs. C'est le pb qu'il faut mettre en évidence, pas tout une mécanique.
Le gros soucis de compréhension se situe dans la construction dynamique des variables, sur ce point il faut revoir ta conception.
Etant donné qu'un job peut être nommé et manipuler par son nom, pourquoi s'en priver? Si ton script est dédié à cette tâche, cela ne devrait pas poser de pb.
De plus, je pense que l'usage d'événement peut t'aider à simplifier ton pb, pas besoin de faire du pooling :
[code:1]$j=start-job -scriptblock {get-process|% {sleep 1}}
$j|gm -type event
# TypeName: #System.Management.Automation.PSRemotingJob
#
#Name MemberType Definition
#----
#StateChanged Event System.EventHandler`1[System.Management.Automation.JobStateEventArgs] StateChanged(System.Ob...
[/code:1]
Bon tu me diras, j'en rajoute une couche, c'est pas faux
Tu devrais consulter les différents états, un job peut être failed, si cela se passe : tu boucles, tu boucles, tu boucles...
As-tu écrit des spécifications pour ce traitement simple ?
Je regarde ça ce WE, étant en train d'écrire un tuto sur les événements sous PS, cela me servira d'exemple
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
EDIT :
Bon j'ai tapé une partie du script en utilisant les event, l'avantage c'est que le script est 50x plus facile à comprendre.Mais c'est bizarre un fois \"l'action\" de l'évènement terminé, le \"processus\" évènement ne s'arrête.(il reste sur \"running\")Le problème est qu'il est sensé envoyer les résultats(grâce à Out-Variable) dans une variable mais du coup il ne le fait pas
[code:1]
#Ce script est sensé récupéré plusieurs Log d'un ordinateur puis il doit ensuite les mettre dans un log unique.
#On récupère la liste des Log à interroger
$ListeLog = Get-Content \"./Liste_Log.txt\"
$Liste_fini = New-Object Collections.ArrayList
#On récupère le nom de l'ordinateur
$pc_nom_unique = Read-Host \"Entrer le nom de l'ordinateur : \"
Write-Host \"Récupération du log de : $pc_nom_unique\"
#On test si la machine exsite
$ping = Get-WmiObject -Class Win32_PingStatus -Filter \"Address='$pc_nom_unique'\"
if ($ping.StatusCode -eq 0) {
foreach ( $objlog_nom1 in $ListeLog) {
Write-Host \"Récupération du log : $objlog_nom1\"
#Job######
Start-Job -ScriptBlock { param($pc_nom_unique,$objlog_nom1,$Liste_unique,$i)
Get-EventLog -EntryType Error -ComputerName \"$pc_nom_unique\" -LogName \"$objlog_nom1\"
Start-Sleep -Seconds 10
} -ArgumentList $pc_nom_unique,$objlog_nom1,$Liste_unique,$i
}
}
else {
Write-Host \" L'ordinateur : $pc_nom n'existe pas \"
}
$Job_Liste = Get-Job
Foreach ($ObjJob in $Job_Liste ) {
Register-ObjectEvent $ObjJob -EventName StateChanged -Action {
$test = Receive-Job $Sender.Id
$test
Remove-Event -EventIdentifier $Event.EventIdentifier
} -OutVariable +resultat | Out-Null
}
Start-Sleep -Seconds 20
Write-Host \"$resultat\"
foreach ( $objresult in $resultat )
{
[void]$Liste_fini.Add((New-object PSObject|
Add-member noteproperty Source \"$($objresult.Source)\" -pass|
Add-member noteproperty Message \"$($objresult.Message)\" -pass)
)
}
$Liste_fini | Out-GridView
Remove-Job *[/code:1]
La pièce jointe script_multi_job-cb1dab61e0dc73dabbc537479d31c9e4.ps1 est absente ou indisponible
Message édité par: bilbao, à: 30/04/10 15:09<br><br>Message édité par: bilbao, à: 30/04/10 15:09
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Start-Job et Variables