PowerShell的'-Version'参数和CLR版本

时间:2012-09-06 18:23:13

标签: powershell powershell-v2.0 powershell-v3.0

我已经安装了PowerShell v3的发布版本,但在使用-Version参数时遇到了一些麻烦。我有很多需要.NET 4.0的模块,我使用PowerShell v2时没有使用以下的powershell.exe.config文件:

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0.30319"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
    <runtime>
        <loadFromRemoteSources enabled="true"/>
    </runtime>
</configuration>

这将允许我使用.NET 4.0 CLR运行PowerShell v2。一切都没有问题。

我现在已经安装了PowerShell v3的发布版本,只要我使用命令'powershell -version 2'并检查$PSVersionTable变量,它就会显示它已经加载了PowerShell v3(使用.NET 4.0) 。如果我删除上面的powershell.exe.config文件并运行相同的命令,则表明已加载PowerShell v2但使用的是.NET 2.0。

所以我的问题是:有没有办法加载PowerShell v2并让它像我以前在安装PowerShell v3之前那样使用.NET 4.0 CLR?或者PowerShell v3不允许这样做?

另外,我应该提一下为什么我要这样做 - 主要是因为当我们切换到V3时可能会出现任何不兼容问题。我打算用V3测试所有内容,但是能够回退到V2可以让我们免于很多麻烦。

2 个答案:

答案 0 :(得分:5)

发生的事情如下:

  • -Version 2
  • 开始
  • Powershell启动,beings绑定到v2运行时/程序集。到目前为止一切顺利。
  • App.config表示应加载.NET 4运行时
  • 随着程序集绑定的进行,有一个.NET发布者策略会在可能的情况下自动将针对v2构建的任何应用程序重定向到v3
    • 这通常是您想要的 - 如果新版本可用,则自动使用
  • 结果是v3运行时/程序集被加载,尽管你的初衷(和Powershell)运行v2。
    • 如果没有.NET 4解决方法,就不会发生这种情况,因为默认情况下v2将在.NET 2下加载,因此发布者策略无法将其重定向到需要.NET 4的v3上。

简单,对吧?!

所以,如果你想在.NET 4上保留PSv2,你需要做的是手动禁用发布者策略。这可以在app.config文件中完成,请参阅相关帖子here

答案 1 :(得分:0)

如果您安装了v3,我不明白为什么要将v2与CLR 4一起使用。如果您的模块需要.NET 4,请使用PowerShell v3:它已使用CLR 4。