从C#调用PowerShell中的特定版本(Call a specific version of P

2019-08-31 19:13发布

我试图用Get-VM Cmdlet的从C#叫做Hyper-V主机上。

显然,根据PowerShell的模块Hyper-V必须首先导入。 然而,导入失败, -显然是因为该模块仅在PowerShell的3.0的支持(至少这是我从图文章 )。 通过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的特定版本的方法吗?

Answer 1:

一位同事想通了:

显然,.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.0version 3.0.0.0预期和PowerShell的模块工作。
如果你只有.NET 3.5,旧版本将被加载; PowerShell中仍然有效,但最多只能到2.0版本。



Answer 2:

你会在这个看吗?

http://code.msdn.microsoft.com/windowsdesktop/Windows-PowerShell-30-SDK-9a34641d

你可能只是需要新的SDK调用Powershell的3即使安装PSv3您的系统上了,但我通常只是一条直线Powershell的家伙。



文章来源: Call a specific version of PowerShell from C#