Question
Start-Job et Variables
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 15 ans 10 mois #6659
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Start-Job et Variables
bilbao écrit:
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:
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.
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.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\")
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:
PowerShell t'en veut, c'est pour çaLe 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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 15 ans 10 mois #6665
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Start-Job et Variables
bilbao écrit:
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
<br><br>Message édité par: Laurent Dardenne, à: 1/05/10 12:51
Comme l'indique la documentation, ce cmdlet ne renvoit aucune donnée dans le pipeline (OUT-).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
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
Tutoriels PowerShell
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 226
- Remerciements reçus 0
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.
Vivement ton prochain tuto sur les events.
On reconnais la qualité de ton code.
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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Start-Job et Variables