Использование SystemDiAgnostics.process для запуска фоновых заданий в PowerShell

StackOverflow https://stackoverflow.com/questions/3195734

Вопрос

Я знаю, что PowerShell имеет фоновую функциональность работы с Start-Job, Wait-Job, и т. д., но возможно ли использовать Process класс из System.Diagnostics в .net, чтобы достичь того же самого? Если это так, как бы лучше всего это было бы сделать/какие преимущества он будет иметь в отношении механизма PowerShell PowerShell для выполнения фоновых заданий?

Это было полезно?

Решение

Вы, безусловно, можете использовать объект процесса, чтобы «запустить» исполняемый асихронный и с помощью объекта процесса, который вы получите, вы можете проверить, чтобы увидеть, выполнен ли EXE или убить процесс. Хитрость заключается в том, чтобы вернуть информацию о выводе и потоке ошибок, не вмешиваясь в консоль, в то время как программа работает, чтобы вы могли делать другие вещи. Из документов MSDN похоже на использование BeginOutputReadLine Может сделать свое дело:

// 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();

Хотя, если вам нужно фоновое поведение, вам нужно было бы выполнить standardoutput.readtoend () на фоновом потоке, а затем создать механизм для извлечения этого вывода из основного консольного потока, который кажется большой работой, и в настоящее время я могу подумать любых преимуществ по сравнению с PowerShell Founal Works.

Другой подход состоит в том, чтобы создать Runspace, чтобы выполнить работу BG, как это Сообщение в блоге Джима Труэра указывает на то.

Другие советы

Это не элегантно или хорошо задокументировано. Он создает систему. DiAgnostic.process объект и выполняет некоторые общие инициализации на нем. После того, как вы получите объект процесса, вы можете выполнить дополнительные настройки на нем, затем вызовите процесс. Запустите процесс.

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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top