PowerShell 7.4 中的新增功能

PowerShell 7.4 包括以下功能、更新和中断性变更。 PowerShell 7.4 是在 .NET 8.0.0 基础上构建的。

有关更改的完整列表,请参阅 GitHub 库中的更改日志

中断性变更

  • Nano Server Docker 映像不适用于此版本
  • 已将 ProgressAction 参数添加到通用参数
  • 更新特定 PowerShell API,以便当参数为空字符串时引发 ArgumentException 而不是 ArgumentNullException (#19215)(感谢 @xtqqczze!)
  • 移除与 #requires -pssnapin 相关的代码 (#19320)
  • Test-Json 现在使用 JsonSchema.NET 而不是 Newtonsoft.Json.Schema。
    • 在此更改后,Test-Json 不再支持更旧的 Draft 4 架构。 (#18141)(感谢 @gregsdennis!)。 有关 JSON 架构的详细信息,请参阅 JSON 架构文档。 这也会中断带有注释的 JSON 和 JSONC 文件的 Test-Json
    • ConvertFrom-Json 支持仍使用 Newtonsoft.Json.Schema,因此它可以转换带有注释的 JSON 文件。
  • 来自 Test-Connection 的输出现在包含有关 TCP 连接测试的更多详细信息
  • .NET 引入了影响 Test-Connection 的更改。 该 cmdlet 现在返回有关使用自定义缓冲区大小时需要在 Linux 平台上使用 sudo 的错误 (#20369)
  • 实验性功能 PSNativeCommandPreserveBytePipe 现在是主流功能。 将原生命令的 stdout 流重定向到文件时,或将字节流数据通过管道传输到原生命令的 stdin 流时,PowerShell 现在将保留字节流数据
  • 更改了使用 RelativeBasePath 参数时处理 Resolve-Path 中的相对路径的方式 (#19755)(感谢 @MartinGC94!)
  • 删除未使用的 PSv2 代码 - 删除 TabExpansion 函数 (#18337)

安装程序更新

Windows MSI 包现提供一种在安装期间禁用 PowerShell 遥测的选项。 有关详细信息,请参阅从命令行安装 msi 包

更新了 PSResourceGet 和 PSReadLine 的版本

PowerShell 7.4 包括 Microsoft.PowerShell.PSResourceGet v1.0.1。 此模块与 PowerShellGet v2.2.5 和 PackageManagement v1.4.8.1 并排安装。 有关详细信息,请参阅 Microsoft.PowerShell.PSResourceGet 文档。

PowerShell 7.4 现在包括 PSReadLine v2.3.4。 有关详细信息,请参阅 PSReadLine 的文档。

Tab 自动补全改进

非常感谢 @MartinGC94 和其他人在改进 tab 补全方面的所有贡献。

  • 解决在脚本中使用空数组表达式补全第一个命令时出现的问题 (#18355)
  • 修复位置参数补全功能 (#17796)
  • 对补全位置参数时设置的默认形参设定优先级 (#18755)
  • 改进动态参数的伪绑定 (#18030)
  • 改进哈希表键的类型推理 (#17907)
  • 修复空返回语句的类型推理错误 (#18351)
  • 改进 Get-Random 的类型推理 (#18972)
  • 修复所有范围变量的类型推理 (#18758)
  • 改进管道中推断类型的枚举 (#17799)
  • 在比较枚举时为比较值添加补全功能 (#17654)
  • 为枚举添加属性分配补全 (#19178)
  • 修复 PSCustomObject 变量属性的补全 (#18682)
  • 修复属性参数中的成员补全功能 (#17902)
  • 从补全结果中排除冗余参数别名 (#19382)
  • 修复具有基类型的类的类成员补全 (#19179)
  • 为 Using 关键字添加补全功能 (#16514)
  • 修复在补全变量时的 TabExpansion2 变量泄露问题 (#18763)
  • 启用跨 ScriptBlock 范围补全变量 (#19819)
  • 修复 foreach 语句变量补全问题 (#19814)
  • 修复变量类型推理优先级 (#18691)
  • 修复 PowerShell 枚举类的成员补全问题 (#19740)
  • 修复方法调用中索引表达式中的数组文本分析问题 (#19224)
  • 改进路径补全 (#19489)
  • 修复空脚本输入的 CompleteInput 中的“索引超出边界”错误 (#19501)
  • 提高变量补全性能 (#19595)
  • 改进类型约束变量赋值、嵌套哈希表等的哈希表键补全问题 (#17660)
  • 将外部应用程序输出推断为字符串 (#19193)
  • 更新枚举的参数补全以排除 ValidateRange 属性不允许的值 (#17750)(感谢 @fflaten!)。
  • 修复动态参数完成 (#19510)
  • 为由 Data 语句分配的变量添加完成 (#19831)
  • 将 Windows 系统上的扩展波形符 (~) 修复为 $home 以防止使用本机命令中断用例 (#21529)

Web cmdlet 的改进

非常感谢 @CarloToso 和其他人在改进 Web cmdlet 方面的所有贡献。

  • 修复 Web cmdlet 中的解压缩以包括 Brotli (#17955)(谢谢 @iSazonov!)
  • Webcmdlet 添加 308 以重定向代码和小型清理 (#18536)
  • 下载完成或取消时补全 Invoke-WebRequest 中的进度栏呈现 (#18130)
  • 如果状态代码为 429,Web cmdlet 会从响应头获取 Retry-After 间隔 (#18717)
  • Web cmdlet 将默认字符集编码设置为 UTF8 (#18219)
  • 将 WebSession.MaximumRedirection 保持不变 (#19190)
  • WebCmdlet 解析 XML 声明来获取编码值(如果存在)。 (#18748)
  • 修复在没有编码的情况下在 webcmdlet 中使用 xml -Body 时出现的问题 (#19281)
  • 调整 PUT 方法行为,使其在 WebCmdlet 中对默认内容类型执行一次 POST (#19152)
  • 在 WebCmdlet 中考虑来自标头的 ContentType (#19227)
  • 允许通过向 Web cmdlet 添加 -PreserveHttpMethodOnRedirect 来保留原始 HTTP 方法 (#18894)
  • Webcmdlet 在从 https 重定向 http 时显示错误 (#18595)
  • 向 Web cmdlet 添加 AllowInsecureRedirect 开关 (#18546)
  • 改进当内容长度未知时 Web cmdlet 中的详细消息 (#19252)
  • 根据 Invoke-WebRequest 中的响应生成链接的相对 URI (#19092)
  • 修复 WebCmdlet 中 -CustomMethod POST 的重定向问题 (#19111)
  • 释放 Webcmdlet 中的先前响应 (#19117)
  • 改进 Invoke-WebRequest xml 和 json 错误格式 (#18837)
  • 将 ValidateNotNullOrEmpty 添加到 WebCmdlet 的 OutFile 和 InFile 参数 (#19044)
  • HttpKnownHeaderNames 更新标头列表 (#18947)
  • Invoke-RestMethod -FollowRelLink 修复包含逗号的链接 (#18829)
  • 修复在 Web cmdlet 中管理重定向和 KeepAuthorization 时的 bug (#18902)
  • 将 StatusCode 添加到 HttpResponseException (#18842)
  • 在 Web Cmdlet 中支持 HTTP 持久连接 (#19249)(感谢 @stevenebutler!)
  • 小型清理 Invoke-RestMethod (#19490)
  • 改进 WebCmdlet 的详细消息以显示正确的 HTTP 版本 (#19616)
  • 将 FileNameStar 添加到 WebCmdlet 中的 MultipartFileContent (#19467)
  • 将 WebCmdlet 的 HTTP 状态从 409 修复为 429,以便从 Retry-After 标头获取重试间隔。 (#19622)(感谢 @mkht!)
  • -TimeoutSec 更改为 -ConnectionTimeoutSeconds 并将 -OperationTimeoutSeconds 添加到 web cmdlet (#19558)(感谢 @stevenebutler!) 其他 cmdlet
  • 在 WebCmdlet 中读取数据而连接挂起时支持 Ctrl+C (#19330)(感谢 @stevenebutler!)
  • 支持 WebCmdlet 中的 Unix 域套接字 (#19343)

其他 cmdlet 改进

  • Test-Connection 现在返回有关使用自定义缓冲区大小时需要在 Linux 平台上使用 sudo 的错误 (#20369)
  • 将输出类型添加到格式命令 (#18746)(感谢 @MartinGC94!)
  • Get-WinEvent 添加输出类型属性 (#17948)(感谢 @MartinGC94!)
  • 将 Path 和 LiteralPath 参数添加到 Test-Json cmdlet (#19042)(感谢 @ArmaanMcleod!))
  • 将 NoHeader 参数添加到 ConvertTo-CsvExport-Csv cmdlet (#19108)(感谢 @ArmaanMcleod!))
  • Stop-Transcript 添加了 Confirm 和 WhatIf 参数 (#18731)(感谢 @JohnLBevan!)
  • Get-Command 添加了 FuzzyMinimumDistance 参数 (#18261)
  • 使 Encoding 参数能够在 PowerShell 中进行 ANSI 编码 (#19298)(感谢 @CarloToso!))
  • 将 progress 添加到 Copy-Item (#18735)
  • 现在,在非美国系统上使用隐式区域性时,Update-Help 会报告错误。 (#17780)(感谢 @dkaszews!)
  • 创建完成的进度记录时不需要活动 (#18474)(感谢 @MartinGC94!)
  • 禁止 Get-Content cmdlet 参数 -Head-Tail 使用负值 (#19715)(感谢 @CarloToso!)
  • 当当前区域性与语言不关联时使 Update-Help 引发适当的错误 (#19765)(感谢 @josea!)
  • 允许在 Select-Object cmdlet 中组合 -Skip-SkipLast 参数。 (#18849)(感谢 @ArmaanMcleod!)
  • 添加 Get-SecureRandom cmdlet (#19587)
  • Set-Clipboard -AsOSC52 用于远程使用 (#18222)(感谢 @dkaszews!)
  • 加快 Resolve-Path 相对路径解析 (#19171)(感谢 @MartinGC94!)
  • 已将 switch 参数 -CaseInsensitive 添加到 Select-ObjectGet-Unique cmdlet (#19683)(感谢 @ArmaanMcleod!)
  • Restart-ComputerStop-Computer 未在 Unix 上通过 sudo 运行时应会失败且显示错误 (#19824)

引擎改进

$PSStyle 的更新

  • 添加了 Dim 和 DimOff 属性 (#18653)
  • 向 PSStyle 类添加了静态方法,用于将前台和后台 ConsoleColor 值映射到 ANSI 转义序列 (#17938)
  • 默认情况下,计算字段的表标题采用斜体格式
  • 现在远程主机上支持采用 $PSStyle.OutputRendering (#19601)
  • 更新了遥测数据以包括对 CrescendoBuilt 模块的使用 (#20371)

其他引擎更新

  • 在声明 NoRunspaceAffinity 属性时使 PowerShell 类与 Runspace 不关联 (#18138)
  • 添加了 ValidateNotNullOrWhiteSpace 特性 (#17191)(感谢 @wmentha!)
  • 向列表中添加了 sqlcmd 以使用旧参数传递 (#18559)
  • 添加了 cd~ 函数 (#18308)(感谢 @GigaScratch!)
  • 修复泛型类型中的数组类型分析问题 (#19205)(感谢 @MartinGC94!)
  • 修复设备路径根目录中的通配符 globbing (#19442)(感谢 @MartinGC94!)
  • 添加用于获取 PSModulePath 元素位置的公共 API (#19422)
  • 修复不正确的字符串到类型转换 (#19560)(感谢 @MartinGC94!)
  • 修复在使用许多断点时执行速度缓慢的问题 (#14953)(感谢 @nohwnd!)
  • 移除与 #requires -pssnapin 相关的代码 (#19320)

实验性功能

PowerShell 7.4 引入了以下实验性功能:

  • PSFeedbackProvider - 将硬编码的建议框架替换为可扩展的反馈提供程序。
    • 此功能还会向 添加 FeedbackName、FeedbackText、和 FeedbackAction$PSStyle.Formatting 属性,以便更改反馈消息的格式。
  • PSModuleAutoLoadSkipOfflineFiles - 模块发现现在跳过了由云提供商标记为不完全在磁盘上的文件。
  • PSCommandWithArgs - 现支持将参数作为单个字符串传递给命令

以下实验性功能现成为主流:

PowerShell 7.4 删除了以下实验性功能:

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