PowerShell - 如何在运行空间导入模块
问题描述:
我想在C#中创建一个cmdlet。该代码看起来是这样的:PowerShell - 如何在运行空间导入模块
[Cmdlet(VerbsCommon.Get, "HeapSummary")]
public class Get_HeapSummary : Cmdlet
{
protected override void ProcessRecord()
{
RunspaceConfiguration config = RunspaceConfiguration.Create();
Runspace myRs = RunspaceFactory.CreateRunspace(config);
myRs.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(myRs);
scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
Pipeline pipeline = myRs.CreatePipeline();
pipeline.Commands.Add(@"Import-Module G:\PowerShell\PowerDbg.psm1");
//...
pipeline.Invoke();
Collection<PSObject> psObjects = pipeline.Invoke();
foreach (var psObject in psObjects)
{
WriteObject(psObject);
}
}
}
但试图执行此cmdlet在PowerShell中给了我这个错误:术语导入模块不被识别为cmdlet的名称。 PowerShell中的相同命令不会给我这个错误。如果我执行'Get-Command',我可以看到'Invoke-Module'被列为CmdLet。
有没有办法在运行空间中执行“导入模块”?
谢谢!
答
有两种方法可以以编程方式导入模块,但我会先解决您的方法。您的行pipeline.Commands.Add("...")
应该只是添加命令,而不是命令AND参数。参数单独加入:
# argument is a positional parameter
pipeline.Commands.Add("Import-Module");
var command = pipeline.Commands[0];
command.Parameters.Add("Name", @"G:\PowerShell\PowerDbg.psm1")
上述管道API是一个有点笨拙的使用和非正式地废弃了许多用途,虽然它在许多高层次的API的基础。在的powershell v2或更高要做到这一点,最好的方法是通过使用System.Management.Automation.PowerShell
类型及其流利API:
# if Create() is invoked, a runspace is created for you
var ps = PowerShell.Create(myRS);
ps.Commands.AddCommand("Import-Module").AddArgument(@"g:\...\PowerDbg.psm1")
ps.Invoke()
使用后一种方法时,另一种方法是使用InitialSessionState,这避免了需要播种到预加载模块运行空间与Import-Module
明确。见我的博客在这里如何做到这一点:
希望这有助于。
谢谢!但Add()方法返回void。我想你需要使用一个Command对象并向它添加一个参数并将其传递给Add方法。您正在谈论以两种方式进行编程,第二种方式是什么? – Absolom 2011-06-07 15:28:10
oops,以第二种方式更新答案。 – x0n 2011-06-07 15:33:59
我还发现,如果您在尝试导入模块时遇到“AuthorizationManager检查失败”异常,请确保您的.psm1文件以UTF8格式保存,而不是以ASCII格式保存。 – Absolom 2011-06-07 15:34:06