【问题标题】:PowerShell's '-Version' parameter and CLR versionsPowerShell 的“-Version”参数和 CLR 版本
【发布时间】:2015-02-22 05:52:56
【问题描述】:

我已安装 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 v3 之前那样加载 PowerShell v2 并让它使用 .NET 4.0 CLR?还是 PowerShell v3 不允许这样做?

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

【问题讨论】:

    标签: powershell powershell-2.0 powershell-3.0


    【解决方案1】:

    发生的事情如下:

    • -Version 2开头
    • Powershell 启动,将绑定到 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我这样做主要是为了在我们切换到 V3 时可能会出现任何不兼容问题。我计划使用 V3 测试所有内容,但是能够回退到 V2 可以让我们免于很多麻烦。
      • 具有讽刺意味的是,完全不支持在 CLR4 上运行 powershell 2.0。
      • 不支持,但很多人使用它。 PowerGUI 甚至在安装后默认配置为这种方式。
      猜你喜欢
      • 2015-07-24
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2021-05-09
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多