Question Start-Job et Variables

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

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\")

Oui, le job lié à un événement est un job spécialisé. C'est un abonnement qui une fois démarré reste à l'écoute des événements (file d'attente de message), là où un job ‘normal’ passe à l’état Terminated.
Les appels à Unregister-Event ne supprime pas le job créé par un abonnement utilisant le paramètre –Action, on doit utiliser le cmdlet Remove-Job
Le cmdlet Stop-Job arrête le job, le passe à l’état Stopped, tout en supprimant l’abonnement, comportement identique à l’appel du cmdlet Unregister-Event MonAbonnement. L’appel de l’un ou de l’autre doit de toute façon être complété par un appel à Remove-Job.

bilbao écrit:

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

PowerShell t'en veut, c'est pour ça ;)
Je regarde ça, c'est au demeurant un très bon exercice didactique et me semble après réflexions peut être plus difficile qu'il n'y paraît.

Tutoriels PowerShell

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

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

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

Comme l'indique la documentation, ce cmdlet ne renvoit aucune donnée dans le pipeline (OUT-).

Voici une approche basée sur les événements qui tient compte de qq erreurs. Les jobs en erreur ne sont pas détruits afin de permettre l'accés aux détails de l'erreur si besoin.
Un autre approche consisterait à utiliser Wait-Job, mais je n'ai pas le temps d'approfondir cette piste.
[code:1]
#Ce script récupére plusieurs journaux de log d'un ordinateur puis il les mémorise dans un log unique.

#On récupère la liste des Log à interroger

#2 cas d'erreur, l'un OU l'autre
$ListeLog = @(\"ACE\",\"Alication\"«»)
$pc_nom_unique=\"..\"

$ListeLog = @(\"ACEEventLog\",\"Application\"«»)
#On récupère le nom de l'ordinateur
$pc_nom_unique=\".\"


#Cette variable PSObject doit contenir tous les log
$global:Liste_unique = New-Object Collections.ArrayList

$global:ErrorJobLog = New-Object Collections.ArrayList

Unregister-event * #test
Remove-Job * #test
$Error.Clear() #test

Write-Host \"Jobs de récupération des logs de : $pc_nom_unique\"
$I = 0
$ListeLog|Foreach {
$I++
$NomAssociation=\"Job_Log_$i\"
$CurrentJob=Start-Job -ArgumentList \"$pc_nom_unique\",$_,$I -Name $NomAssociation -ScriptBlock {
param($pc_nom_unique,$Logname)
Try{
Write-Host \"$pc_nom_unique - Récupération du log : $Logname\"
Get-EventLog -EntryType Error -ComputerName \"$pc_nom_unique\" -LogName $Logname |
Foreach {
#Construit un objet personnalisé contenant
#certaines informations d'une entrée de log
$Obj=New-object PSObject -property @{
Date=$_.TimeGenerated;
Source=$_.Source;
Message=$_.Message;
Nom_Log=$Logname;
Nom_Ordi=$_.MachineName}
#Emet l'objet dans le pipeline
#On le récupérera via le cmdlet Receive-Job
$obj
}#foreach
} Catch {
#Si c'est une erreur non bloquante on force le job à l'état Failed
#machine inconnue, nom de journal inconnu
Throw $_
}
} #sb

$null=Register-ObjectEvent $CurrentJob StateChanged -SourceIdentifier \"StateChanged_$NomAssociation\" -MessageData $Logname -Action {
$eventname=$EventArgs.JobStateInfo.ToString()
Write-host \"Evénement : $($EventSubscriber.SourceIdentifier) Status : $eventname\"
#http://msdn.microsoft.com/en-us/library/system.management.automation.jobstate(VS.85).aspx
Switch ($eventname) {

#The job has successfully run the commands of the pipeline in all runspaces
'Completed' {
#Récupère et ajoute les entrées de log
# dans la liste globale
Receive-Job -id $Sender.Id |
Foreach { [void]$global:Liste_unique.Add($_)}
Write-Warning \"Supprime le job de récupération d'un log.\"
Remove-Job -id $Sender.Id
break
}
#The job was not able to successfully run the commands of the pipeline.
'Failed' {
#Write-Properties (Get-job -id $Sender.Id).Childjobs[0].JobStateInfo.Reason
Write-host (\"Le job {0} a déclenché l'erreur : {1}\" -F $Sender.Id, (Get-job -id $Sender.Id).Childjobs[0].JobStateInfo.Reason.Message) -fore Red
# *** Ici on ne supprime pas le job de récupération d'un log ***
break
}
#The job has been cancelled on one or more runspace
'Stopped' {
Write-Warning (\"Le job {0} a été arrêté.\" -F $Sender.Id)
break
}

default { Write-Warning \"cas non géré.\" } #todo tests

}#Switch
Write-Warning \"Annule l'abonnement de l'event 'StateChanged' du job de récupération d'un log.\"
UnRegister-Event -SubscriptionId $EventSubscriber.SubscriptionId
Write-Warning \"Supprime le job lié à la gestion de l'événement 'StateChanged' du job de récupération d'un log.\"
Remove-job -id $EventSubscriber.Action.Id
} #Action
}#foreach

$Liste_unique | Export-Csv -Path \"./Log.csv\" -Encoding UTF8
[/code:1]
Il reste qq trucs à vérifier/ajouter, je te laisse faire :)

La pièce jointe Recup_logv2.zip est absente ou indisponible

<br><br>Message édité par: Laurent Dardenne, à: 1/05/10 12:51

Tutoriels PowerShell
Pièces jointes :

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

Plus d'informations
il y a 15 ans 10 mois #6673 par Arthur
Réponse de Arthur sur le sujet Re:Start-Job et Variables
Merci beaucoup pour le script après quelques modifications il marche sans problème.
On reconnais la qualité de ton code. :woohoo:
Vivement ton prochain tuto sur les events.

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

Pièces jointes :

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

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