父进程终止时要终止的c#运行空间进程
我正在使用Microsoft.PowerShell.5.1.ReferenceAssembly运行一些PowerShell脚本父进程终止时要终止的c#运行空间进程,c#,powershell,C#,Powershell,我正在使用Microsoft.PowerShell.5.1.ReferenceAssembly运行一些PowerShell脚本 private void RunScript(string command) { var runspace = RunspaceFactory.CreateRunspace(); runspace.Open(); var builder = new StringBuilder(); va
private void RunScript(string command)
{
var runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
var builder = new StringBuilder();
var task = new Task(() => {
var pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(command);
try
{
var result = pipeline.Invoke();
foreach (var r in result)
{
builder.Append(r.ToString());
}
}
catch (Exception e)
{
builder.Append(e);
}
runspace.Close();
var consoleOutput = builder.ToString();
runspace.Dispose();
});
psScriptsRunning.Add(runspace);
task.Start();
}
我跟踪psScriptsRunning中的运行空间。因此,当我的应用程序关闭时,我会遍历并关闭运行空间
public void deinit()
{
foreach(var runspace in psScriptsRunning)
{
runspace.Dispose();
}
}
这将关闭powershell脚本及其生成的任何进程。然而,似乎需要一段时间才能真正关闭流程,如果您有更好的方法来改进这一点,请让我知道
但是,如果有人从任务管理器中杀死我的应用程序,此代码将不会运行。如何终止由powershell脚本启动的任何进程
以前,在通过运行空间直接支持powershell脚本之前,我曾创建一个进程并通过powershell.exe启动
我能够通过使用作业对象确保生成的任何进程都被终止,请参见
现在我正在使用运行空间,如何实现同样的效果
我之所以选择运行空间而不是使用powershell.exe,是因为powershell脚本的启动时间更长。经过一些调查后确定。结果我眼前就有了答案。
private void RunScript(string command)
{
var runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
var builder = new StringBuilder();
var task = new Task(() => {
var pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(command);
try
{
var result = pipeline.Invoke();
foreach (var r in result)
{
builder.Append(r.ToString());
}
}
catch (Exception e)
{
builder.Append(e);
}
runspace.Close();
var consoleOutput = builder.ToString();
runspace.Dispose();
});
psScriptsRunning.Add(runspace);
task.Start();
}
作业对象是c#代码
这就是我所需要的。我为我创建的所有子进程调用它,似乎我不需要这样做。我所要做的就是在申请过程中调用它。然后,我的应用程序创建的所有进程(即通过运行空间等)都会自动标记为来自同一作业。因此,当有人杀死我的应用程序进程时,所有其他进程也会被杀死
我只是犯了一个错误,以为我必须得到子进程,然后自己分配给工作。你可能想看看。我只使用了c#变体,没有使用powershell,但我认为他们使用的是类似的工作方式。我不确定这对我有什么帮助。我已使用powershell作业对象启动新进程。然而,我在帖子中提到的工作对象与此不同。