Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
父进程终止时要终止的c#运行空间进程_C#_Powershell - Fatal编程技术网

父进程终止时要终止的c#运行空间进程

父进程终止时要终止的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

我正在使用Microsoft.PowerShell.5.1.ReferenceAssembly运行一些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();
    }
我跟踪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作业对象启动新进程。然而,我在帖子中提到的工作对象与此不同。