2010-07-07 6 views
2

Je sais que Powershell a des fonctionnalités de travail de fond avec Start-Job, Wait-Job, etc., mais est-il possible d'utiliser le pour obtenir la même chose Process classe de System.Diagnostics en .Net? Si oui, quelle serait la meilleure façon de le faire/quels avantages cela aurait-il par rapport au mécanisme Powershell par défaut d'exécution des tâches en arrière-plan?Utiliser systemdiagnostics.process pour exécuter des travaux de fond dans Powershell

Répondre

2

Vous pouvez certainement utiliser l'objet de processus pour « lancer » l'exécutable asychronously et avec l'objet de processus, vous revenez vous pouvez tester pour voir si le fichier EXE est fait ou tuer le processus. L'astuce consiste à récupérer les informations de flux de sortie et d'erreur sans interférer avec la console pendant que le programme s'exécute pour que vous puissiez faire d'autres choses. A partir de la documentation MSDN, il ressemble à l'aide du BeginOutputReadLine pourrait faire l'affaire:

// Start the child process. 
Process p = new Process(); 
// Redirect the output stream of the child process. 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.FileName = "Write500Lines.exe"; 
p.Start(); 
// Do not wait for the child process to exit before 
// reading to the end of its redirected stream. 
// p.WaitForExit(); 
// Read the output stream first and then wait. 
string output = p.StandardOutput.ReadToEnd(); 
p.WaitForExit(); 

Bien que si vous voulez que le comportement de fond que vous devrez effectuer la StandardOutput.ReadToEnd() sur un thread d'arrière-plan, puis créer un mécanisme pour récupérer cette sortie du thread de la console principale qui semble être beaucoup de travail et pour le moment je peux penser à des avantages sur les travaux d'arrière-plan PowerShell.

Une autre approche consiste à créer un espace d'exécution pour que le travail bg fonctionne, comme le souligne blog post by Jim Truher.

0

Ceci n'est pas élégant ou bien documenté. Il crée un objet System.Diagnostic.Process et effectue certaines initialisations communes sur celui-ci. Une fois que vous obtenez l'objet Process, vous pouvez effectuer des ajustements supplémentaires, puis appelez Process.Start pour démarrer le processus.

function New-Process($cmd, $arguments, [switch]$stdout, [switch]$stdin, [switch]$stderr, [switch]$shellexec, [switch]$showwindow) 
{ 
    $process = New-Object "System.Diagnostics.Process" 
    $startinfo = New-Object "System.Diagnostics.ProcessStartInfo" 

    $startinfo.FileName = $cmd 
    $startinfo.Arguments = $arguments 
    $startinfo.WorkingDirectory = $pwd.Path 
    $startinfo.UseShellExecute = $shellexec 
    $startinfo.RedirectStandardInput = $stdin 
    $startinfo.RedirectStandardOutput = $stdout 
    $startinfo.RedirectStandardError = $stderr 

    if (!$showwindow) { 
     $startinfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden 
    } 

    $process.StartInfo = $startinfo 

    return $process 
} 
+0

Comment puis-je exécuter powershell.exe pour appeler le fichier test1.ps1 et obtenir la sortie dans le journal? – Kiquenet

Questions connexes