Question [Tutoriel] Les jobs sous Powershell

Plus d'informations
il y a 9 ans 3 mois #18516 par Laurent Dardenne
Un tutoriel sur la manipulation des jobs sous Powershell .

1 LE PRINCIPE 4
2 CMDLETS DEDIES AU JOB 5
2.1 LA DOCUMENTATION EXISTANTE 6
3 LES ETATS D’UN JOB 7
3.1 ETAT D’UN JOB 7
3.2 DETAIL DES ETATS 8
4 UTILISER UN JOB LOCAL 9
4.1 EXECUTION D’UN BACKGROUNDJOB 9
4.2 RECUPERER LE RESULTAT D’UN JOB 10
4.2.1 Les flux à réceptionner 11
4.2.2 APIs d’affichage 11
4.3 ATTENDRE LA FIN D’UN JOB 12
4.3.1 Waiting for the sun 13
4.4 SUPPRIMER UN JOB 13
4.5 STEVE, JE SUIS TON PERE. 14
5 UN PEU DE PLOMBERIE 15
5.1 CREATION 15
5.2 SUPPRESSION 17
6 AUTRES POINTS A CONSIDERER 18
6.1 PASSAGE DE PARAMETRES 18
6.1.1 Portée Using : 19
6.1.2 PSSenderInfo 20
6.2 INITIALISATION DU TRAITEMENT D’UN JOB 21
6.2.1 InitializationScript 21
6.3 PROFONDEUR DE SERIALISATION 22
6.4 GESTION D’ERREUR 24
6.4.1 Cas d’une erreur simple 24
6.4.2 Cas d’une erreur bloquante 25
6.4.3 Gestion de code retour d’un programme exécuté à distance 26
6.4.4 Intercepter les erreurs émises par Receive-Job 28
6.5 RUNSPACEPOOL 28
7 SUIVI 29
7.1 CHANGEMENTS D’ETAT 29
7.1.1 Utiliser une collection synchronisée 30
7.2 RESTE A FAIRE 31
7.3 ROLLBACK 31
7.4 LOG 31
7.5 TIME OUT SUR UN JOB 32
7.5.1 PSBeginTime et PSEndTime 32
7.6 THROTTLELIMIT 33
7.7 ÉVENEMENT REEXPEDIE 33
7.8 WAIT-EVENT 33
7.8.1 Créer un launcher 34
8 UTILISER UN JOB DISTANT 35
8.1 EXECUTION D’UN REMOTEJOB 35
8.2 INVOKE-COMMAND 35
8.2.1 ThrottleLimit 36
8.3 CHANGEMENTS D’ETAT 36
8.3.1 PSBeginTime et PSEndTime 36
8.3.2 Wait-Job 37
8.3.3 Receive-Job 38
8.4 GESTION D’ERREUR 38
9 LE PARAMETRE -ASJOB 39
9.1 IMPLEMENTER ASJOB 39
10 TYPES DE JOB 40
10.1.1 PSWorkflowJob 41
10.1.2 PSEventJob (job d’événement) 41
10.1.3 ScheduledJob 41
10.1.4 Wmi & Cim 42
10.1.5 Custom job 42
11 LIENS 43
12 CONCLUSION 43

[edit]
Un possible bug affectant un status de job erroné.<br><br>Message édité par: Laurent Dardenne, à: 23/03/17 10:22

Tutoriels PowerShell

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

Plus d'informations
il y a 6 ans 1 mois #24921 par Laurent Dardenne
PS Core permet d'utiliser le caractère '&amp;' pour exécuter une instruction dans un job
[code:1]
dir *.ps1&amp;
[/code:1]
Cette ligne renvoi un job dans le pipeline, on peut donc l'affecter à une variable :
[code:1]
$Job=dir *.ps1&amp;
[/code:1]
Ensuite on utilise les cmdlets de gestion de job pour le manipuler.
C'est un raccourcis d'écriture. Si on regarde C# , on constate que PS insère automatiquement un appel à Set-location afin d'exécuter le job dans le répertoire courant.
On remarque également que les variables utilisées dans la ligne d'appel sont automatiquement préfixées de $using :
[code:1]
$Path ='*.ps'
$Job=dir $Path&amp;
(Wait-Job -Job $job).ChildJobs[0].Command
#Microsoft.PowerShell.Management\Set-Location -LiteralPath $using:«»pwd ; dir ${using:«»Path}
[/code:1]
Les variables suivantes, qu’elles soient ou non préfixées de Global: , ne sont pas recopiées : PID,PSVersionTable,PSEdition,PSHOME,HOST,TRUE,FALSE,NULL
L'inexistence d'une variable indiquée dans la ligne d'appel ne provoquera pas d'erreur.

Et enfin on y lit que PS appel bien en interne le cmdlet Start-Job.
Pour rappel $using cible les variables pas les fonctions, le code prérequis n'est pas automatiquement recopié dans le job créé.

A l'origine le caractère '&amp;' est un opérateur d'appel, sémantiquement ce choix ne pose pas de problème.
Mais dans le cas suivant on peut se demander quel est l'ordre d’exécution :
[code:1]
$sb={get-process pwsh*}
dir *.ps1&amp;$sb
[/code:1]
Ici c'est l'exécution de job qui prime, ensuite PS affiche le contenu du scriptblock.
On est tenté de doubler les opérateurs :
[code:1]
dir *.ps1&amp;&amp;$sb
[/code:1]
Ce qui n'est pas possible, on déclenche une exception : \&quot;The token '&amp;&amp;' is not a valid statement separator in this version.\&quot;
Il faut ajouter un séparateur, un espace ou un point virgule ';' :
[code:1]
dir *.ps1&amp; &amp;$sb
dir *.ps1&amp;;&amp;$sb
[/code:1]
Pour la ligne suivante :
[code:1]
dir *.ps1&amp;$sb
[/code:1]
le caractère '&amp;' dans ce contexte fait office implicitement de séparateur de commande. PS émet 2 objets dans le pipeline, un job et une chaine de caractères.
Je vous laisse déterminer la différence entre ces deux lignes :
[code:1]
&amp;{get-process pwsh*}&amp;dir *.ps1&amp;
{get-process pwsh*}&amp;dir *.ps1&amp;
[/code:1]
Sachez qu'il reste qq cas où cette opérateur provoque une exception, le détail ici .

Pour retrouver cette écriture dans l'AST on doit utiliser la classe PipelineAst qui a été modifiée pour prendre en charge ce type de construction :
[code:1]
$sb={dir *.ps1&amp;}
$T=$sb.Ast.FindAll({$args[0] -is [System.Management.Automation.Language.PipelineAst]},$true)
$T.Background
#True
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 2/02/18 16:07

Tutoriels PowerShell

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

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