【发布时间】:2021-03-03 07:13:02
【问题描述】:
我正在使用 C#/.NET API 构建一些 PowerShell cmdlet,并且有一个 cmdlet 需要访问所有当前导入的模块。如果我在终端中运行Get-Module,我可以看到加载了 10 多个模块,但是当我的 cmdlet 运行时:
using(var ps = PowerShell.Create(RunspaceMode.Current))
{
var modules = ps.AddCommand("Get-Module").Invoke<PSModuleInfo[]>();
/// ...
}
modules 这里是空的。它几乎就像一个范围问题,但我认为RunspaceMode.Current 将允许您访问在您首先打开pwsh shell 时打开的底层运行空间。
我一定是遗漏了什么或者误解了运行空间的工作原理。
【问题讨论】:
-
“需要访问所有当前导入的模块的 cmdlet”听起来像是代码异味……您要完成什么?
-
嗯,这不是我正在处理的代码,只是一个基本示例。但是,我的代码会生成一些动态 PS 模块代理,并且在“完成”我的 cmdlet 之后,我需要它自行清理。所以我试图在这些动态模块上调用“Remove-Module”,当从 cmdlet 内部运行时似乎什么都没有发生。它似乎与“Get-Module”有同样的问题,它是一个更简单的例子,这就是我在我的问题中使用它的原因。
-
如果我直接在 PS 中编写我的 Cmdlet,这一切都会奏效,所以我想我不明白为什么当你在 C# 中尝试它时这不起作用。
标签: c# powershell .net-core