1

这就是我在 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、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。

我假设模块现在已经加载到内存中,我只需要调用它。(注意这里的模块名和命令名是一样的)

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

更新: 也试过这个,即从路径显式加载模块->>没有运气-

    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\Modules\MyModules\MyModule1\MyModule1.psm1”匹配的参数。

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

4

2 回答 2

0

终于明白了:-

而不是这样做 -

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

做这个 -

_ps.AddScript(listBox1.SelectedItem.ToString()).Invoke();
于 2012-05-09T14:55:39.767 回答
0

包含什么listBox1.SelectedItem

如果只是名称MyModule1是用$env:PSModulePath?

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

于 2012-05-09T13:15:28.910 回答