2010-07-07 2 views
2

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

ответ

2

Можно, конечно, использовать объект Process для «запуска» исполняемый asychronously и с объектом процесса вы получите обратно вы можете проверить, чтобы увидеть, если 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.

Другой подход заключается в создании рабочей области для выполнения работы bg, как это указывает blog post by Jim Truher.

0

Это не элегантный или хорошо документированный. Он создает объект System.Diagnostic.Process и выполняет некоторые общие инициализации. Как только вы получите объект «Процесс», вы можете выполнить дополнительные настройки на нем, а затем вызвать Process.Start, чтобы начать процесс.

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

Как я могу выполнить powershell.exe, чтобы вызвать файл test1.ps1 и получить вывод в журнал? – Kiquenet

Смежные вопросы