Использование SystemDiAgnostics.process для запуска фоновых заданий в PowerShell
-
02-10-2019 - |
Вопрос
Я знаю, что 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
}