我正在尝试在我的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添加到runconfig:
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>");
任何有助于实现这一目标的帮助将不胜感激。谢谢!