0

我正在尝试使用 .NET 的 System.Management 库运行不同的 PowerShell 命令,但我看到每次运行空间共享同一个 shell。更具体地说,如果我在我的操作系统上打开一个 PowerShell 窗口并运行以下命令:

Get-Runspace

我得到以下输出:

Id Name            ComputerName    Type          State         Availability
-- ----            ------------    ----          -----         ------------
 1 Runspace1       localhost       Local         Opened        Busy

如果我现在打开另一个窗口并再次运行相同的命令,我会得到相同的输出,据我所知,我在不同的会话中有不同的运行空间具有相同的名称。如果我错了,请在这里纠正我!

现在,如果我运行以下代码来运行该Get-Runspace命令两次:

static void Main(string[] args)
{
    for (int i = 1; i <= 2; i++)
    {
        PowerShell ps = PowerShell.Create();
        ps.AddCommand("Get-Runspace");
        var result = ps.Invoke();

        foreach (PSObject elem in result)
        {
            Runspace runspace = (Runspace)elem.BaseObject;
            Console.WriteLine(runspace.Name);
        }
        Console.WriteLine();
    }
    Console.ReadLine();
}

我得到以下输出

Runspace1

Runspace1
Runspace2

这意味着 Runspace1 从 Runspace2 可见,因此它们共享相同的 shell。

相反,我希望得到以下输出,其中两个运行空间位于不同的 shell 中:

Runspace1

Runspace1

这种行为是可能的还是我的逻辑被打破了?请注意,关闭运行空间不足以解决我的问题。

4

1 回答 1

1

如果“相同的外壳”是指“相同的过程”,那么是的。

ARunspace必然受限于单个应用程序域,.NET 中的应用程序域不能跨越多个进程,所以关系是:

+---------------------------------+
| Process                         |
| +-----------------------------+ |
| | AppDomain                   | |
| | +-----------+ +-----------+ | |
| | | Runspace1 | | Runspace2 | | |
| | +-----------+ +-----------+ | |
| +-----------------------------+ |
+---------------------------------+

Get-Runspace仅枚举当前主机应用程序域中的运行空间。


如果需要,您可以在单独的进程中隔离运行空间,使用RunspaceFactory.CreateOutOfProcessRunspace()

using (PowerShell ps = PowerShell.Create())
{
    var isolatedShell = new PowerShellProcessInstance();
    var isolatedRunspace = RunspaceFactory.CreateOutOfProcessRunspace(TypeTable.LoadDefaultTypeFiles(), isolatedShell);

    ps.Runspace = isolatedRunspace;

    ps.AddCommand("Get-Runspace");
    var result = ps.Invoke();

    foreach (PSObject elem in result)
    {
        Runspace runspace = (Runspace)elem.BaseObject;
        Console.WriteLine(runspace.Name);
    }
    Console.WriteLine();
}
于 2020-05-19T14:24:54.017 回答