PowerShell-如何在运行空间中导入模块
本文关键字:导入 模块 空间 运行 PowerShell- | 更新日期: 2023-09-27 17:58:30
我正在尝试在C#中创建cmdlet。代码看起来像这样:
[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);
}
}
}
但是尝试在PowerShell中执行此CmdLet会出现以下错误:术语"导入模块"未被识别为CmdLet的名称。PowerShell中的同一命令没有给我此错误。如果我执行"获取命令",我可以看到"调用模块"被列为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
显式地为运行空间播种的需要。
InitialSessionState initial = InitialSessionState.CreateDefault();
initialSession.ImportPSModule(new[] { modulePathOrModuleName1, ... });
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
RunspaceInvoke invoker = new RunspaceInvoke(runspace);
Collection<PSObject> results = invoker.Invoke("...");
希望这能有所帮助。
执行此操作的最简单方法是使用AddScript()
方法。你可以做:
pipeline.AddScript("Import-Module moduleName").Invoke();
如果您想在同一行中添加另一个导入
pipeline.AddScript("Import-Module moduleName 'n Import-Module moduleName2").Invoke();
对于.Invoke()
来说,这不是强制性的。一旦将脚本添加到管道中,就可以添加更多脚本并在以后调用。
pipeline.AddScript("Import-Module moduleName");
pipeline.AddCommand("pwd");
pipeline.Invoke();
有关更多信息,请访问Microsoft官方网站