执行包含Commandlet的Powershell脚本

时间:2018-05-23 16:10:07

标签: c# powershell scripting arguments pipeline

我需要从C#执行包含我的自定义Commandlet(存在于不同程序集中)的Powershell脚本。我尝试了以下方法,但它只调用了一次命令行开关,就是它,而在脚本中,这个命令行开关被多次写入。

Get-MyParameter myTasks

Start-Process notepad.exe

Get-MyParameter myTasks
Get-MyParameter myTasks
Get-MyParameter myTasks

虽然,MyParameter是用不同的程序集编写的。 Tried Code是:

var powerShellInstance = PowerShell.Create();
powerShellInstance.Runspace = runSpace;

var command = new Command("Import-Module");

command.Parameters.Add("Assembly", Assembly.LoadFrom(@"..\CommandLets\bin\Debug\Commandlets.dll"));

powerShellInstance.Commands.AddCommand(command);
powerShellInstance.Invoke();

powerShellInstance.Commands.Clear();    
powerShellInstance.Commands.AddCommand(new Command("Get-MyParameter"));             

powerShellInstance.AddScript(psScript);

var result = powerShellInstance.Invoke();

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您正在将脚本添加到添加了Get-MyParameter命令的同一管道中。实际上,你正在做

get-myparameter | { … your script … }

尝试使用单独的管道。

var result1 = powerShellInstance.AddCommand("Get-MyParameter").Invoke()
var result2 = powerShellInstance.AddScript(psScript).Invoke();

此外,您可以将模块加载代码简化为

powerShellInstance.AddCommand("Import-Module").
    AddParameter("Name", @"..\CommandLets\bin\Debug\Commandlets.dll")).
        Invoke();