Powershell / C#:导入和调用嵌套模块

时间:2012-05-09 11:28:49

标签: c# powershell powershell-v2.0

这是我在ListBox中加载嵌套模块的方法。

public partial class Form1 : Form
    {
        readonly PowerShell _ps = PowerShell.Create();
        public Form1()
        {
            InitializeComponent();

            _ps.AddScript("Import-Module MyModules");
            _ps.AddScript("(Get-Module MyModules).NestedModules");
            Collection<PSObject> psObjects = _ps.Invoke();

            foreach (var psObject in psObjects)
            {
                listBox1.Items.Add(psObject);
            }
}

现在,如果用户选择了特定的模块,我想执行相同的操作。

这似乎不起作用[虽然应该加载模块,它应该识别命令] -

_ps.AddCommand(listBox1.SelectedItem.ToString()).Invoke();

例外:

  

术语“MyModule1”未被识别为cmdlet的名称,   功能,脚本文件或可操作程序。检查拼写   名称,或者如果包含路径,请验证路径是否正确   再试一次。

我认为模块现在已经被加载到内存中了,我只需要调用它。 (注意,模块名称和命令名称在这里相同)

///////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////////////////

更新 试图这样做,即明确地从路径加载模块 - &gt;&gt;没有运气 -

    var path = ((PSModuleInfo) (((PSObject) (listBox1.SelectedItem)).ImmediateBaseObject)).Path;
    path=path.Replace("system32", "SysWOW64");

    _ps.AddCommand("Import-Module");
    _ps.AddParameter(path);
    _ps.Invoke();

更新后的异常: [虽然存在模块,但在ISE x86 shell中运行良好]

  

找不到与参数名称匹配的参数   'C:\的Windows \ Syswow64资料\ WindowsPowerShell \ V1.0 \模块\ MyModules \ MyModule1 \ MyModule1.psm1'。

///////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////////////////

2 个答案:

答案 0 :(得分:0)

listBox1.SelectedItem包含哪些内容?

如果只是名称MyModule1$env:PSModulePath找到的名称?

我怀疑它不在模块搜索路径中,而是在模块MyModules中加载了相对路径。因此,您需要将Import-Module完整路径(或者,如果您可以控制当前目录,相对路径)传递给模块的主文件(.psd1.psm1或{{1}如适用)。

答案 1 :(得分:0)

终于明白了: -

而不是这样做 -

_ps.AddCommand(listBox1.SelectedItem.ToString()).Invoke();

执行此操作 -

_ps.AddScript(listBox1.SelectedItem.ToString()).Invoke();