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

dro*_*ohm 2 powershell powershell-2.0 powershell-3.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>
Run Code Online (Sandbox Code Playgroud)

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

我现在已经安装了PowerShell v3的发布版本$PSVersionTable,只要我使用命令'powershell -version 2'并检查变量,它就会显示它已经加载了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可以让我们免于很多麻烦.

lat*_*kin 5

发生的事情如下:

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

简单吧?!

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