2 votes

Exécution de cmdlets supplémentaires après le lancement d'un job

Supposons que j'ai un travail simple qui commence comme ceci :

$job = Start-Job -ArgumentList 1, 2 -ScriptBlock {
        $var1 = $args[0]
        $var2 = $args[1]

        $var3 = $var1 + $var2

        Write-Host $var3
}

Supposons maintenant que je veuille continuer à exécuter la session qui est $job et introduire de nouveaux arguments et simplement continuer à exécuter à l'intérieur de $job.

D'après ce que j'ai compris, ce n'est pas comme ça que les jobs fonctionnent dans Powershell. Une fois que les commandes à l'intérieur du job ont été exécutées, le job est considéré comme terminé et ne peut plus être recyclé. Si ma compréhension est correcte, existe-t-il un autre moyen d'obtenir l'effet d'avoir effectivement une tâche d'arrière-plan à l'intérieur de votre session powershell que vous pouvez continuer à injecter avec de nouvelles commandes/variables, sans avoir à créer un nouveau job/session/processus ? Pour plus de clarté, il s'agit d'une application locale (sur la même machine).

2voto

Dennis Points 376

Je pense que vous feriez mieux de vous tourner plutôt vers les espaces d'exécution PowerShell qui peuvent communiquer entre eux puisqu'ils sont des threads des mêmes processus.

Start-Job démarre en fait une nouvelle session PowerShell dans un processus isolé distinct.

Voir, MS Docs - Start-Job -RunAs32 et MS Scripting - Début d'utilisation des espaces d'exécution PowerShell

2voto

mklement0 Points 12597

La réponse utile de Dennis fournit le pointeur crucial : utilisez le SDK PowerShell pour créer une instance PowerShell en cours de processus que vous pouvez utiliser pour l'invocation répétée de commandes.

L'exemple de code suivant en fait la démonstration : Il vous demande toujours une commande à exécuter et utilise une seule commande réutilisable, le PowerShell pour l'exécuter (appuyez sur Ctrl-C pour sortir) :

$ps = [powershell]::Create()

while ($true) {
  $cmd = Read-Host 'Type a command to execute'
  # Execute and output the results.
  $ps.AddScript($cmd).Invoke()
  # Relay errors, if any.
  $ps.Streams.Error | Write-Error
  # Reset in preparation for the next command.
  $ps.Commands.Clear(); $ps.Streams.ClearStreams()
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X