从C#应用程序中托管的PowerShell中分离进程

时间:2017-10-30 13:40:57

标签: c# powershell process start-job start-process

我们有一个C#应用程序将PowerShell脚本作为扩展点执行,我们无权更改此代码,但它几乎是以下内容:

string command = @"C:\temp.ps1";
var fileName = "powershell";
var args = $"-ExecutionPolicy unrestricted . '{command}'";

var process = CreateProcess(fileName, args);
ExecuteProcess(ref process);

private Process CreateProcess(string fileName, string args)
{
    return new Process
    {
        StartInfo =
        {
            FileName = fileName,
            Arguments = args,
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            UseShellExecute = false
        }
    };
}

private int ExecuteProcess(ref Process proc)
{
    proc.Start();

    string text = string.Empty;
    string text2 = string.Empty;
    while (!proc.HasExited)
    {
        Thread.Sleep(1000);
        text += proc.StandardOutput.ReadToEnd();
        text2 += proc.StandardError.ReadToEnd();
    }
    proc.WaitForExit();
    text2 += proc.StandardError.ReadToEnd();
    text += proc.StandardOutput.ReadToEnd();

    Console.WriteLine(text);
    Console.WriteLine(text2);

    return proc.ExitCode;
}

我们有一个PowerShell脚本可以从具有长时间运行过程的代码执行,为了保持这一点,我们只需使用带有ping.exe参数的-t

ping -t google.com

我们希望能够分叉ping.exe进程,以便c#应用程序可以尽快恢复执行,并且此示例中的ping.exe继续以它的快乐方式继续。

我试图在powershell脚本中运行Start-Process但这仍然只是阻止了C#应用程序的执行,直到所有进程完全执行(因此最终运行完成):

Start-Process ping -ArgumentList "-t","google.com" -RedirectStandardOutput ".\out.log" -RedirectStandardError ".\err.log"

我还试图运行Start-Job并将启动过程包装在一个单独的工作中,但是,这似乎开始了工作但从未完成

Start-Job -ScriptBlock { Start-Process ping -ArgumentList "-t","google.com" -RedirectStandardOutput ".\out.log" -RedirectStandardError ".\err.log" }

有没有办法从PowerShell中启动新进程并允许C#应用程序继续执行?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方法 - 如果我将-Verb Open传递给Start-Process,它似乎会立即恢复执行到C#应用程序。唯一的问题是您无法将标准输出或错误重定向到文件。

Start-Process ping -ArgumentList "-t","google.com" -Verb Open