这是我在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'。
的 ///////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////// 的
答案 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();