我正在尝试在Hyper-V主机上使用从C#调用的Get-VM
Cmdlet。
显然,必须首先导入相应的PowerShell模块Hyper-V
。但导入失败 - 显然是因为该模块仅在PowerShell 3.0上受支持(至少这是我从this article得到的)。但是,System.Management.Automation使用的PowerShell似乎是2.0版本。
InitialSessionState iss = InitialSessionState.CreateDefault();
iss.ImportPSModule(new string[] { "Hyper-V" });
Runspace runSpace = RunspaceFactory.CreateRunspace(iss);
runSpace.Open();
foreach (var err in (ArrayList)runSpace
.SessionStateProxy.PSVariable.GetValue("Error"))
Console.WriteLine(err.ToString());
runSpace.Close();
返回
在 'C:\ WINDOWS \ SYSTEM32 \ WindowsPowerShell \ V1.0 \模块\的Hyper-V \超V.psd1' 无法导入模块,因为其清单包含一个或多个成员 这是无效的。有效的清单成员是('ModuleToProcess',...)。 删除无效的成员('HelpInfoUri'), 然后尝试再次导入模块。
有没有办法在C#中使用特定版本的PowerShell?
答案 0 :(得分:3)
一位同事弄清楚了:
显然,.NET 4+附带了一个全新的公共语言运行时:CLR4
此运行时使用从位于C:\Windows\Microsoft.NET\assembly
的新程序集缓存加载的自己的程序集。
System.Management.Automation version 3.0.0.0
将自动使用PowerShell 3.0,仅适用于CLR4。因为我将我的应用程序配置为在.NET 3.5下运行,所以它将使用旧的CLR2,甚至看不到更新的程序集。
要确保应用程序仍可在.NET 3.5上运行,请将其添加到项目文件夹中的App.config
文件中:
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>
如果CLR4可用,它将加载相应的GAC,找到一个策略文件,将所有对System.Management.Automation version 1.0.0.0
的引用重定向到version 3.0.0.0
,并且PowerShell-Modules按预期工作。<登记/>
如果您只有.NET 3.5,则会加载旧版本; PowerShell仍然有效,但只能达到2.0版本。
答案 1 :(得分:1)
你看过这个了吗?
http://code.msdn.microsoft.com/windowsdesktop/Windows-PowerShell-30-SDK-9a34641d
即使你的系统上已经安装了PSv3,你可能只需要新的SDK来调用Powershell 3,但我通常只是一个直接的Powershell人。