PowerShell 7.1 的新内容

2020年11月11日 ,我们宣布 PowerShell 7.1正式发布。 在PowerShell 7.0奠定的基础上,我们的工作重点关注社区问题,并包括多项改进和修复。 我们致力于确保PowerShell保持稳定和高性能的平台。

PowerShell 7.1 包含以下功能、更新和重大变更。

  • PSReadLine 2.1.0,包含预测性IntelliSense。
  • PowerShell 7.1 已发布至 Microsoft Store
  • 安装包已更新为支持ARM64的新作系统版本
  • 4个新的实验性功能和2个实验性功能被提升为主流
  • 若干破坏性改进以提升可用性

有关更改的完整列表,请参阅 GitHub 存储库中的 CHANGELOG

PSReadLine 2.1.0

PowerShell 7.1 还包含 PSReadLine 2.1.0。 该版本包含预测智能感知(Predictive IntelliSense)。 有关预测性IntelliSense功能的更多信息,请参阅PowerShell博客中的 公告

Microsoft Store 安装包

PowerShell 7.1 已发布至 Microsoft Store。 你可以在 Microsoft Store 官网或 Windows 的 Store 应用中找到 PowerShell 版本。

Microsoft Store 包的权益:

  • 直接内置于 Windows 的自动更新
  • 可与其他软件分发机制如 Intune 和 SCCM 集成

注释

存储在 中 $PSHOME 的任何系统级配置设置都无法修改。 其中包括 WSMAN 配置。 这可以防止远程会话连接到 PowerShell 的基于应用商店的安装。 支持用户级配置和 SSH 远程处理。

其他安装商

有关支持作系统和支持生命周期的更多 up-to信息,请参见 PowerShell支持生命周期

请查看您偏好作系统的安装说明:

此外,PowerShell 7.1 支持 Debian、Ubuntu 和 ARM64 的 ARM32 和 ARM64 版本 Alpine Linux。

虽然没有官方支持,但社区也提供了 Arch 和 Kali Linux 的软件包。

注释

Debian 10+、CentOS 8+、Ubuntu 20.04、Alpine 和 Arm 目前不支持 WinRM 远程处理。 关于如何设置基于SSH的远程访问,请参见 PowerShell Remoting over SSH

实验特性

有关实验性功能的详细信息,请参阅使用实验性功能

以下实验性功能现已成为本版本的主流内容:

本次发布中增加了以下实验性功能:

  • Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace

    • PowerShell 7.1 扩展了这一实验性功能,为所有 *-PSBreakpoint cmdlet 添加了 Runspace 参数。 Runspace 参数指定一个 Runspace 对象,用于与指定 runspace 中的断点交互。
  • PSNativePSPathResolution - 该功能允许你将PowerShell提供者路径传递给不支持PowerShell路径语法的本地命令。

  • PSCultureInvariantReplaceOperator - 当运算符语句中的 -replace 左侧作数不是字符串时,该作数会被转换为字符串。 启用该功能后,转换时字符串转换不会使用文化设置。

  • PSSubsystemPluginModel 为未来预测性IntelliSense插件的支持奠定了基础。

突破性变更与改进

  • .NET 5.0 中字符串比较行为的更改

    PowerShell 7.1 基于 .NET 5.0 构建,该版本引入了以下重大变更:

    自 .NET 5.0 起,文化不变字符串比较忽略非打印控制字符。

    例如,以下两条字符串被认为是相同的:

    # Escape sequence "`a" is Ctrl-G or [char]7
    'Food' -eq "Foo`ad"
    
    True
    
  • 修复$?修复,当本地命令写入(stderr#13395)时不会被写入$false

    本地命令写入 stderr 时常常不打算指示失败。 此更改 $? 仅在原生命令也有非零退出码时才设置为 $false 。 这一变化与实验特征 PSNotApplyErrorActionToStderr无关。

  • 不要 $ErrorActionPreference 影响 stderr 本地命令的输出(#13361

    本地命令写入 stderr 时常常不打算指示失败。 通过这一变化,stderr输出仍然被 ErrorRecord 对象捕获,但如果 ErrorRecord 来自本地命令,运行时不再适用$ErrorActionPreference

  • 将重命名 -FromUnixTime-UnixTimeSeconds on Get-Date ,以便输入Unix时间(#13084)(谢谢) @aetos382!)

    -FromUnixTime 参数是在7.1-preview.2期间添加的。 参数被重新命名以更好地匹配数据类型。 该参数取一个整数值,自1970年1月1日0:00:00起,以秒为单位。

    该示例将Unix时间(以1970-01-01 0:00:00以来的秒数表示)转换为DateTime。

    Get-Date -UnixTimeSeconds 1577836800
    
    Wednesday, January 01, 2020 12:00:00 AM
    
  • 允许明确指定的命名参数取代哈希表 splatting 中的相同参数(#13162)

    通过这一变化,splatting中命名的参数被移至参数列表末尾,使其在所有显式指定命名参数绑定后才被绑定。 对于简单函数的参数绑定,当找不到指定命名参数时不会报错。 未知命名参数绑定于 $args 简单函数的参数。 将 splatting 移到参数列表末尾会改变参数出现 $args的顺序。

    例如:

    function SimpleTest {
        param(
            $Name,
            $Path
        )
        "Name: $Name; Path: $Path; Args: $args"
    }
    

    在之前的行为中, MyPath 不被绑定于 , -Path 因为它是参数列表中的第三个参数。 ## 所以它最终被塞进了“$args”里,和 Blah = "World"

    PS> $hash = @{ Name = "Hello"; Blah = "World" }
    PS> SimpleTest @hash "MyPath"
    Name: Hello; Path: ; Args: -Blah: World MyPath
    

    通过这一变化,来自 @hash 的参数被移到了参数列表的末尾。 MyPath 成为列表中的第一个参数,因此它被绑定于 -Path

    PS> SimpleTest @hash "MyPath"
    Name: Hello; Path: MyPath; Args: -Blah: World
    
  • 将开关参数 -Qualifier 设置为非位置性 Split-Path#12960)(谢谢) @yecril71pl!)

  • 将工作目录解析为未指定时的字面路径 Start-Process#11946)(谢谢) @NoMoreFood!)

  • -OutFile网页 cmdlet 中的参数像 (#11701) 一样工作-LiteralPath(谢谢)@iSazonov!)

  • 修复数值文字字符串参数绑定 BigInteger#11634)(谢谢) @vexx32!)

  • 在 Windows 上, Start-Process 创建一个包含当前会话中所有环境变量的进程环境,使用 -UseNewEnvironment 创建新的默认进程环境(#10830)(谢谢) @iSazonov!)

  • 当将aScriptBlock转换为代理时,不要包裹返回结果PSObject#10619

    当a ScriptBlock 被转换为C#上下文中使用的代理类型时,用a PSObject 包裹结果会带来不必要的麻烦:

    • 当值转换为代理返回类型时,基本上 PSObject 会被展开。 所以这 PSObject 其实没必要。
    • 当代理返回类型为 object时,它会被 包裹在 a PSObject 里,这让在 C# 代码中作起来很困难。

    在这一变化之后,返回的对象就是底层对象。