我们有一个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#应用程序继续执行?
答案 0 :(得分:0)
我找到了一个解决方法 - 如果我将-Verb Open
传递给Start-Process
,它似乎会立即恢复执行到C#应用程序。唯一的问题是您无法将标准输出或错误重定向到文件。
Start-Process ping -ArgumentList "-t","google.com" -Verb Open