Question

Je sais que Powershell a des fonctionnalités de travail de fond avec Start-Job, Wait-Job, etc., mais est-il possible d'utiliser la classe Process de System.Diagnostics en .Net pour obtenir la même chose? Si oui, quelle serait la meilleure façon de le faire / quels avantages serait-il sur le mécanisme par défaut de Powershell l'exécution des travaux de fond?

Était-ce utile?

La solution

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 à obtenir la sortie et le flux d'erreur de retour d'information sans interférer avec la console alors que le programme est runnng afin 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 de créer un mécanisme pour récupérer cette sortie du thread principal de la console qui semble comme beaucoup de travail et au moment Je peux penser à des avantages par rapport aux travaux d'arrière-plan PowerShell.

Une autre approche est de créer un espace d'exécution pour faire le travail de l'emploi bg comme ce

Autres conseils

Ce n'est pas élégant ou bien documenté. Il crée un objet System.Diagnostic.Process et exécute quelques initialisations communes à ce sujet. Une fois que vous obtenez l'objet de processus, vous pouvez effectuer des réglages supplémentaires à ce sujet, 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
}
scroll top