从C#调用特定版本的PowerShell

时间:2013-04-22 13:26:04

标签: c# powershell hyper-v powershell-module

我正在尝试在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?

2 个答案:

答案 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人。