尽管已注册,C#仍无法加载PowerShell管理单元

时间:2014-05-08 17:08:49

标签: c# windows powershell

我正在尝试在我的C#程序中使用自定义snapin for powershell。 (C#程序是修改后的版本this

我正在使用标准方法来设置运行空间:

    Runspace runspace = RunspaceFactory.CreateRunspace(); 
    runspace.Open();
    Pipeline pipeline = runspace.CreatePipeline();
    pipeline.Commands.AddScript(scriptText);
    Collection<PSObject> results = pipeline.Invoke();
    runspace.Close();

如果我按原样运行并且scriptText包含命令“Get-PSSnapin”,则我的snapin丢失了。如果我运行“Get-PSSnapin -Registered”,那么我可以看到我的snapin。如果我使用Add-PSSnapin,那么它不返回任何内容和我发出的后续命令(在snapin中实现将返回):

“...不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。 “

因此,我修改了我的代码以将cmdlet添加到runco​​nfig:

        RunspaceConfiguration runConfig = RunspaceConfiguration.Create();
        PSSnapInException psEx = null;
        runConfig.AddPSSnapIn("mySnapin", out psEx);
        Runspace runspace = RunspaceFactory.CreateRunspace(runConfig); 

现在,当我运行它时,我得到:

“脚本中的错误:无法调用此函数,因为当前主机未实现它。”

我尝试了x86和64版本。 snapin安装在x86程序中,所以我通过编译x86来完成。如果我做64版本,我得到:

“脚本错误:此计算机上未安装Windows PowerShell管理单元'mySnapin'”。确认这是特定于x86。

我也尝试将其作为一个模块(绝望)加载,但它也不会那样工作。我跑的时候

        get-command <command in mySnapin> | select Module, PsSnapin

输出没有模块,只有snapin,因此开始时很傻。

我应该注意,这是由另一个程序安装的,我无法控制它的安装位置。我认为这可能是一个因素,但是因为它出现了-Register我觉得它没有问题。

编辑:

我也尝试过import-module。这不会输出任何内容以及后续调用我的snapin中的函数:

“脚本中的错误:无法调用此函数,因为当前主机未实现它。”

然后又在C#中,因为我不清楚是否会在调用之间保留导入。

        pipeline.Commands.Add("Import-Module");
        var command = pipeline.Commands[0];
        command.Parameters.Add("Name", @"<path to my snapin .dll>");

任何有助于实现这一目标的帮助将不胜感激。谢谢!

0 个答案:

没有答案