使用 System.Management 在单独的 powershell shell 中创建运行空间
Create Runspaces in separate powershell shells with System.Management
我正在尝试 运行 使用 .NET 的 System.Management 库执行不同的 PowerShell 命令,但我发现每次 运行 空间共享相同的 shell。更具体地说,如果我在我的 OS 上打开一个 PowerShell window 并且我 运行 执行以下命令:
Get-Runspace
我得到以下输出:
Id Name ComputerName Type State Availability
-- ---- ------------ ---- ----- ------------
1 Runspace1 localhost Local Opened Busy
如果我现在再次打开另一个 window 和 运行 相同的命令,我会得到相同的输出,从中我了解到我有不同的 运行 具有相同名称的空间不同的会议。如果我错了,请在这里纠正我!
现在,如果我 运行 以下代码 运行 执行 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。
我希望得到以下输出,其中两个 运行 空格位于不同的 shells:
Runspace1
Runspace1
这种行为是可能的还是我的逻辑被破坏了?请注意,关闭运行空间不足以解决我的问题。
如果 "same shell" 你的意思是 "the same process",那么是的。
一个Runspace
必然局限于一个单一的应用域,.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();
}
我正在尝试 运行 使用 .NET 的 System.Management 库执行不同的 PowerShell 命令,但我发现每次 运行 空间共享相同的 shell。更具体地说,如果我在我的 OS 上打开一个 PowerShell window 并且我 运行 执行以下命令:
Get-Runspace
我得到以下输出:
Id Name ComputerName Type State Availability
-- ---- ------------ ---- ----- ------------
1 Runspace1 localhost Local Opened Busy
如果我现在再次打开另一个 window 和 运行 相同的命令,我会得到相同的输出,从中我了解到我有不同的 运行 具有相同名称的空间不同的会议。如果我错了,请在这里纠正我!
现在,如果我 运行 以下代码 运行 执行 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。
我希望得到以下输出,其中两个 运行 空格位于不同的 shells:
Runspace1
Runspace1
这种行为是可能的还是我的逻辑被破坏了?请注意,关闭运行空间不足以解决我的问题。
如果 "same shell" 你的意思是 "the same process",那么是的。
一个Runspace
必然局限于一个单一的应用域,.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();
}