Question Start-Job et Variables

Plus d'informations
il y a 15 ans 10 mois #6627 par Arthur
Start-Job et Variables a été créé par Arthur
Bonjour,
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 :P )
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. :pinch:
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? :laugh:<br><br>Message édité par: bilbao, à: 28/04/10 11:52

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 10 mois #6630 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Start-Job et Variables
bilbao écrit:

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. :pinch:

Je dirais que c'est le sujet qui est relativement complexe, et c'était plus une étude des problématiques liés aux runspaces.
Sinon on utilise une seule instruction voir ce post (dans un contexte session principale/Modules).
bilbao écrit:

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?

Non, et je ne pense pas que cela soit le cas un jour.
bilbao écrit:

Bref quelqu'un aurait il une solution ?

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).
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 \&quot;connecte\&quot; à des pipelines.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 10 mois #6633 par Arthur
Réponse de Arthur sur le sujet Re:Start-Job et Variables
J'ai aussi testé la Cmdlet \&quot;Receive-Job\&quot; mais bizarrement elle n'a pas l'air de marcher car une fois le script terminer(avec la cmdlet Receive-job dedans),quand je tape Receive-Job il me renvoie les résultats alors que normalement je ne devrais pas pouvoir vus que la commande à déjà était effectué. ( je n'ai pas mis le paramètre \&quot;-keep\&quot; ).
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.

Plus d'informations
il y a 15 ans 10 mois #6641 par Arthur
Réponse de Arthur sur le sujet Re:Start-Job et Variables
Bon, j'ai enfin réussi le petit script, il est un peut difficile à comprendre(:sick:) , mais bon j'ai écris quelques commentaires.
Il me reste donc à récupérer le résultat de chaque job.

La pièce jointe Recup_log.ps1 est absente ou indisponible

<br><br>Message édité par: bilbao, à: 29/04/10 14:10
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 10 mois #6645 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Start-Job et Variables
bilbao écrit:

il est un peu difficile à comprendre(:sick:) ,

Ouai, mais un peu alors. Tu as attaqué le pb par la face nord, c'est pour ça ;)
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 :P
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.

Plus d'informations
il y a 15 ans 10 mois #6648 par Arthur
Réponse de Arthur sur le sujet Re:Start-Job et Variables
Je n'avais pas pensé, en effet à l'utilisation d'event,je vais creuser cette idée dans les jours prochains.(J'ai en tête un moyen pour régler tous mes problèmes :laugh: je posterai le code une fois finit)

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 \&quot;l'action\&quot; de l'évènement terminé, le \&quot;processus\&quot; évènement ne s'arrête.(il reste sur \&quot;running\&quot;)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 :dry:

[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 \&quot;./Liste_Log.txt\&quot;
$Liste_fini = New-Object Collections.ArrayList
#On récupère le nom de l'ordinateur
$pc_nom_unique = Read-Host \&quot;Entrer le nom de l'ordinateur : \&quot;
Write-Host \&quot;Récupération du log de : $pc_nom_unique\&quot;
#On test si la machine exsite
$ping = Get-WmiObject -Class Win32_PingStatus -Filter \&quot;Address='$pc_nom_unique'\&quot;

if ($ping.StatusCode -eq 0) {
foreach ( $objlog_nom1 in $ListeLog) {
Write-Host \&quot;Récupération du log : $objlog_nom1\&quot;
#Job######
Start-Job -ScriptBlock { param($pc_nom_unique,$objlog_nom1,$Liste_unique,$i)
Get-EventLog -EntryType Error -ComputerName \&quot;$pc_nom_unique\&quot; -LogName \&quot;$objlog_nom1\&quot;
Start-Sleep -Seconds 10
} -ArgumentList $pc_nom_unique,$objlog_nom1,$Liste_unique,$i

}
}
else {
Write-Host \&quot; L'ordinateur : $pc_nom n'existe pas \&quot;
}

$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 \&quot;$resultat\&quot;
foreach ( $objresult in $resultat )
{
[void]$Liste_fini.Add((New-object PSObject|
Add-member noteproperty Source \&quot;$($objresult.Source)\&quot; -pass|
Add-member noteproperty Message \&quot;$($objresult.Message)\&quot; -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

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.055 secondes
Propulsé par Kunena