首页
/ PowerShell 7.4 LTS 更新日志全解:从 preview.1 到 7.4.18 的功能、修复与构建演进

PowerShell 7.4 LTS 更新日志全解:从 preview.1 到 7.4.18 的功能、修复与构建演进

2026-09-05 16:36:41作者:吴年前Myrtle

PowerShell 7.4 是 7.x 系列的首个长期服务(LTS)版本线,其完整演进轨迹记录在仓库的 CHANGELOG/7.4.md 中,覆盖 2022-12-20 的 7.4.0-preview.17.4.18 共 22 个版本节点。读完本文,你将掌握 7.4 版本线全部面向用户的功能变更(含 4 处 Breaking Change)、关键 Cmdlet 与引擎修复、每个服务版本对应的 .NET 8 SDK 升级节奏,以及这些变更在仓库源码中的具体落点,为升级评估、兼容性排查与源码定位提供一份可直接检索的参考。

版本时间线概览

7.4 版本线遵循「preview → rc → GA → 服务补丁」的标准节奏:

版本 日期 定位
7.4.0-preview.1 2022-12-20 首个预览版,基于 .NET 7 RC2
7.4.0-preview.2 2023-03-14 迁移至 .NET 8 Preview
7.4.0-preview.3 2023-04-20 移除 PSv2 残留代码
7.4.0-preview.4 2023-06-29 Test-Json 换底层引擎
7.4.0-preview.5 2023-08-21 补全 Tab 补全与 WebCmdlets 能力
7.4.0-preview.6 2023-09-28 实验特性批准转正
7.4.0-rc.1 2023-10-24 候选发布
7.4.0 2023-11-16 GA,绑定 .NET 8.0.0 RTM
7.4.1 2024-01-11 首个服务补丁
7.4.2 2024-04-11 回归修复集中版本
7.4.3 2024-06-18 原生进程与补全修复
7.4.4 2024-07-18 模块清单路径解析修复
7.4.5 2024-08-20 WebCmdlets 修复
7.4.6 2024-10-22 构建打包与 PMC 映射
7.4.7 / 7.4.8 / 7.4.9 内部版本(7.4.8、7.4.9 明确标注 "internal only, not available for download")
7.4.10 回到公共发布
7.4.11 2025-06-17 AMSI 方法调用日志修复
7.4.12 ~ 7.4.18 以构建、打包与安全修复为主的持续服务

值得注意的构建节奏:7.4 分支始终跟踪 .NET 8 的最新 SDK 补丁——从 7.4.0 的 8.0.0 RTM,经 7.4.1 的 8.0.101、7.4.3 的 8.0.6、7.4.5 的 8.0.400,一路演进到 7.4.18 的 8.0.423。每个服务版本的 changelog 段落都以 "Update to .NET SDK 8.0.xxx" 作为折叠块的标题,这本身就是 LTS 分支持续跟进运行时补丁的直观证据。当前仓库主干的 global.json 已指向 .NET 11 SDK 预览版,说明本工作区检出的是主开发分支,而 7.4 分支在发布时锁定 .NET 8。

preview 阶段:核心功能定型(preview.1 ~ preview.6)

7.4.0-preview.1(2022-12-20):实验特性批量转正

这一版是 7.4 功能定型的起点,多个实验特性在此转正(Make experimental feature stable):

  • PSNativeCommandArgumentPassing:Windows 上原生命令参数传递方式切换;
  • PSExecexec 从别名改为函数以支持任意参数处理(#18567);
  • PSCleanBlock:支持 clean 块;
  • PSAMSIMethodInvocationLogging:AMSI 方法调用日志;
  • PSRemotingSSHTransportErrorHandling:SSH 传输错误处理。

同期的重要变更包括:

  • 引擎侧:为 $PSStyle 增加 DimDimOff 属性(#18653);NullString::Value 在方法解析时按字符串类型处理(#18080);伪绑定改进动态参数(#18030);WriteConsole 不再对超大缓冲使用 stackalloc(#18084)。
  • 原生进程:在 Unix 上仅在非后台时显式终止原生进程(#18215);Switch-Process 修正 termios 设置(#18467)与环境变量复制(#18452)。
  • Cmdlet 侧:新增 Get-Command -FuzzyMinimumDistance 参数(#18261);Invoke-WebRequest 下载进度以人类可读格式显示(#14611)并去掉小文件的 1 秒最小延迟(#17896);Add-Type -PassThru 过滤编译器生成的类型(#18095);SetLastError 对符号/硬链接原生 API 置为 true(#19566 在后续版本跟进)。
  • 性能侧:使用 source generator 生成 PSVersionInfo 以改善启动时间(#15603);启动时跳过建议求值(#18232);将部分额外类型初始化移至后台线程(#18195)。
  • 代码清理:大规模将 DllImport 替换为 LibraryImport(引擎与 SMA 共多批提交)、重写 Get-FileHash 使用静态 HashData 方法(#18471)、删除 PSv2CompletionCompleter 前置的 PSv2 清理。

从源码结构看,实验特性转正后的清单维护在 experimental-feature-windows.jsonexperimental-feature-linux.json 中;当前主干上仍保留 PSNativeWindowsTildeExpansionPSSubsystemPluginModel 等后续批次特性,说明该机制在 7.4 之后继续运转。

7.4.0-preview.2(2023-03-14):公共参数 -ProgressAction

本版的 Breaking Changes 有两条,是 7.4 全周期中影响面最大的公共 API 变更:

  • 新增公共参数 -ProgressAction(#18887):与 -Verbose-ErrorAction 等并列的 ActionPreference 参数,允许调用方直接控制进度输出的处理策略。该参数实现位于 CommonCommandParameters.csProgressAction 属性),并在 cmdlet.csMshCommandRuntime.csReflectionParameterBinder.cs 中贯通了绑定与写入路径;
  • 部分 PowerShell API 对空字符串参数改抛 ArgumentException 而非 ArgumentNullException(#19215)。

其他要点:

  • WebCmdlets 大版本增强:支持 HTTP 持久连接(#19249);HTTPS→HTTP 重定向时报错(#18595,仅在两个 URI 都是绝对地址时判定,#19468 后续修正);新增 -PreserveHttpMethodOnRedirect(#18894)、-AllowInsecureRedirect(#18546)、-FollowRelLink 修复含逗号链接(#18829);HttpResponseException 增加 StatusCode 属性(#18842);
  • ConvertTo-Csv/Export-Csv 新增 -NoHeader 参数(#19108);
  • Test-Json 新增 -Path-LiteralPath 参数(#19042),为后续更换底层引擎做准备;
  • pwsh 主机新增 -CommandWithArgs 参数(#18726),实现在 Program.cs
  • 其他:$MyInvocation 新增 Statement 属性(#19027);Copy-Item 增加进度报告(#18735)并修复除零(#19038);Get-Error 修复严格模式下不可用的问题(#18895);支持在模块中创建组合式子系统实现(#18888)。

7.4.0-preview.3(2023-04-20):-RelativeBasePath 登场

Breaking Change:移除与 #requires -pssnapin 相关的全部代码(#19320),彻底告别 PowerShell v2 概念。

功能要点:

  • Resolve-Path 新增 -RelativeBasePath 参数(#19358):允许显式指定相对路径解析的基准,不再强制以当前位置为准。实现见 ResolvePathCommand.cs,其中对基准路径做了 provider 校验(非导航型 provider 会抛出 ProviderIsNotNavigationCmdletProvider 错误);当基准位于 Home 位置时还会做有效性检查。同一参数在 CompletionCompleters.cs 中被 Tab 补全路径解析复用(补全时以 AddParameter("RelativeBasePath", ...) 传入);
  • Start-Process 新增 -Environment 参数(#19374);
  • WebCmdlets 支持在读取数据挂起时按 Ctrl+C(#19330);-OutFile 允许直接给目录路径(#19007);
  • 性能:Resolve-Path 相对路径解析提速(#19171);
  • 反馈建议子系统:ICommandPredictor 接口更新以减少样板代码(#19414),支持触发器注册(#19525);
  • 其他:Add-Type 竞态条件修复(#19471);AutomationNull$null 的类型转换赋值(#19415);外部应用输出推断为字符串(#19193)。

7.4.0-preview.4(2023-06-29):Test-Json 换引擎与 WebCmdlets 超时重构

本版的两处 Breaking Change 直接改变常用 Cmdlet 的底层实现:

  • Test-JsonNJsonSchema(Newtonsoft.Json)切换到 JsonSchema.Net(System.Text.Json)(#18141)。仓库中可看到对应实现 TestJsonCommand.cs 与配套异常类型 JsonSchemaReferenceResolutionException.cs,且资源文件覆盖了 16 种语言的本地化字符串;
  • Test-Connection 在 TCP 模式下增加输出详情(#11452)。

功能要点:

  • 新增 Get-SecureRandom Cmdlet(#19587):基于 System.Security.Cryptography 的密码学安全随机数生成,继承自 GetRandomCommandBase,输出类型为 int/long/double。实现极其精简——GetSecureRandomCommand.cs 全文只有一个 [Cmdlet(VerbsCommon.Get, "SecureRandom", ...)] 特性标注的空类,全部逻辑由基类承担;
  • WebCmdlets 超时期望重构:-TimeoutSec 更名为 -ConnectionTimeoutSeconds 并保留别名,新增 -OperationTimeoutSeconds(#19558);429 状态码从 Retry-After 头读取重试间隔(#19622);MultipartFileContent 新增 FileNameStar(#19467);
  • 引擎侧:新增实验特性控制 Windows 原生参数传递方式(#18706);支持原生命令与文件重定向之间的字节流管道(#17857);增加 WDAC Audit 日志(#19641);公开获取 PSModulePath 元素位置的 API(#19422);修复大量断点场景下的慢执行问题(#14953);
  • 补全质量提升:变量跨 ScriptBlock 作用域补全(#19819)、foreach 语句变量补全(#19814)、Hashtable 键补全覆盖类型约束赋值与嵌套 Hashtable(#17660)、字典/枚举成员补全修复;
  • Get-Content -Head/-Tail 拒绝负值(#19715);Update-Help 支持部分文化匹配(#18037)且当前文化无法映射语言时抛出正确错误(#19765);
  • New-Item-Force 时重建 Junction(#18311);创建 Junction 要求绝对路径的错误消息(#19409);
  • Set-Clipboard -AsOSC52 支持远程场景(#18222)。

7.4.0-preview.5(2023-08-21):补全与 WebCmdlets 的集中补强

Breaking Change:Resolve-Path 在使用 RelativeBasePath 参数时对相对路径的处理方式变更(#19755)——这是该参数在 preview.3 引入后的行为修正。

功能要点:

  • Wait-Process 新增 -Any-PassThru 参数(#19423):-Any 表示任一进程退出即返回,-PassThru 返回 Process 对象。两者均可在 Process.cs 中确认,WaitProcessCommand 类内同时声明了 AnyPassThru 两个 SwitchParameter
  • Select-ObjectGet-Unique 新增 -CaseInsensitive 参数(#19683);
  • WebCmdlets 支持 Unix domain socket(#19343);
  • 引擎补全修复一批:动态参数补全(#19510)、脚本断点查找改用 OrdinalIgnoreCase(#20046)、带自定义 PSDrive 名的文件系统路径补全回归(#19921)、Data 语句赋值变量的补全(#19831)、补全代码空引用崩溃(#19916);
  • 模块路径加入时对 null/空白组件做防护(#19922);修复向已关联文件扩展名的 shell 管道时的死锁(#19940);
  • Restore-Computer/Stop-Computer 在非 sudo 的 Unix 环境下显式报错(#19824);非 Windows 平台增加 Help 代理函数(#19972);
  • Out-GridView 通过实现 Clone() 方法替换旧的二进制格式序列化(#20050,后续 7.4.0-preview.6 曾回滚、7.4.16 再次以自定义实现完成,见下文)。

7.4.0-preview.6 与 rc.1(2023-09 ~ 2023-10):收尾与 .NET 8 RC 迁移

  • preview.6(2023-09-28):将批准用于 7.4 发布的实验特性置为 stable(#20362);回滚 Out-GridViewBinaryFormatter 相关改动(#20360);移除反馈提供者的注释触发(#20346);构建基线移至 .NET 8.0.100-rc.1;新增 SBOM 到发布管线(#20519);mariner arm64 进入 PMC 发布(#20257、#20348);
  • rc.1(2023-10-24):集中修复 .NET 8 引入的回归——Test-Connection 因 .NET 8 变更而修复(#20369);unixmode 对非可执行文件的 setuid/sticky 处理(#20366);UNC 路径补全回归(#20419);隐式远程代理 cmdlet 对公共参数的处理(#20367);Copy-Item 进度条仅在所有文件复制完成后才显示完成(#20517);DSC 回归修复(#20268);Microsoft.Management.Infrastructure 提升至 3.0.0 系列;alpine tar 包名修复且不再对 alpine fxdependent 包做 crossgen(#20459)。

7.4.0 GA(2023-11-16):绑定 .NET 8.0.0 RTM

GA 版的功能变更收敛为三项 Cmdlet 修复:

  • WebCmdlets 补齐缺失的 ConfigureAwait(false) 调用以免阻塞(#20622)——这是一处影响宿主集成场景(如 ASP.NET 内调用)的真实缺陷;
  • Group-Object 输出改用当前文化(#20623);
  • 受限远程会话中阻止从网络位置获取帮助(#20615)。

构建侧的核心动作是把 .NET 从 RC 切换到 8.0.0 RTM 构建Microsoft.PowerShell.Native 同步到 v7.4.0,PSResourceGet 更新到 1.0.1,并移除了 ErrorRecord 中的 Auth 头内容(Internal 28409)以降低凭据泄露面。

服务补丁期(7.4.1 ~ 7.4.18):按版本逐项解析

7.4.1(2024-01-11)

  • Cmdlet:Group-Object 输出使用插值字符串修复(#20745);Start-Process -PassThru 确保返回的 Process 对象可访问 ExitCode(#20749);网络 PSDrive 的 DisplayRoot 渲染修复(#20793);
  • 引擎:WDAC ETW 事件记录确保文件名非空(#20910);修复 WDAC audit 日志特性引入的 4 处回归(#20913);
  • 构建:runtimeconfig.jsonrollForwardOnNoCandidateFx 设为仅向 minor/patch 版本滚动(#20689)——这是 LTS 场景下控制运行时滚动策略的关键配置;停止向 packages.microsoft.com 发布 RHEL7 包(#20849)。

7.4.2(2024-04-11)

一个以"回归修复"为主题的版本:

  • Cmdlet:回滚 WebCmdlets 中"PUT 默认内容类型按 POST 处理"的行为(#21049);Get-Content -Tail 0 -Wait 组合回归修复(#20734);Get-Error 数组值序列化修复(#21085);Format-Table 空表头标签回归修复(#21156);
  • 引擎:回滚 #17856("无需时不保留临时结果")(#21368);确保程序集/库解析器在早期阶段注册(#21361);WDAC Audit 日志处理 Runspace.DefaultRunspacenull 的情况(#21344);PowerShell 类支持从带抽象属性的抽象类派生(#21331);$_ 类型推断回归修复(#21223);
  • 构建:PSReadLine 提升至 2.3.5(#21414);PSResourceGet 从 1.0.2 提到 1.0.4.1(#21439)。

7.4.3(2024-06-18):原生进程与补全修复集中版

  • Cmdlet:Start-Process -Credential 在无管理员权限时不再误报错(#21393);Test-Path -IsValid 正确检查非法路径与文件名字符(#21358);
  • 引擎:受限语言模式(Constrained Language Mode)下 OutputType 生成修复(#21605);Windows 上 Tab 补全时 ~ 展开为 $home(#21529,对应 7.4 转正后的 PSNativeWindowsTildeExpansion 特性);确保原生可执行文件的 stdout 与 stderr 都能被重定向(#20997);
  • 构建:升级 .NET 8.0.6;为 PowerShell.Windows.x64 全局工具创建 powershell.config.json(#23941,对应 src/GlobalTools/PowerShell.Windows.x64 工程);修复 GlobalToolShim 参数传递(#21333,实现在 GlobalToolShim.cs);生成 win-arm64 的 MSI 安装器(#20516)。

7.4.4(2024-07-18)

  • 引擎:导入模块文件或模块清单引用文件时正确解析路径(Internal 31780)——这一类"相对路径解析"问题与 preview 阶段的 RelativeBasePath 工作是同一主题在模块加载路径上的延伸;
  • 构建:macOS 包文件签名(#24015);.NET 升至 8.0.303。

7.4.5(2024-08-20)

  • Cmdlet:WebCmdlets 在指定了 -Body 但未指定 ContentType 时的行为修复(#24145),这是 7.4 后期被高频引用的一个请求语义修正;
  • 测试:mac syslog 测试重写以降低 flaky(#24152);
  • 构建:.NET 升至 8.0.400;RPM/DEB 使用正确的签名证书(#21522);记录安装选项并在下次安装时初始化复用(#24143)。

7.4.6(2024-10-22):构建与打包主导的版本

功能侧无用户可见变更,重点是发布基础设施:为 Debian 12 (bookworm) 添加 PMC 映射(#24413)、azurelinux 仓库映射(#24290);buildinfo JSON 增加 BaseUrl(#24376);Debian 包增加 libicu 依赖(#24301);checkin 生成的 manpage(#24423,对应 assets/manpage/pwsh.1);NuGet 源管理重构(#24104、#24426 将 Microsoft feeds 设为默认)。

7.4.7 / 7.4.8 / 7.4.9:内部构建与发布管线重组

三个版本中 7.4.8 与 7.4.9 在 changelog 中明确标注"内部专用,不对外下载"。对外可见的要点:

  • 7.4.7:AssemblyVersion 从 7.4.7 起在服务版本中保持稳定不再变化(#24821)——对依赖程序集版本匹配的工具链是重要的兼容性决策;
  • 7.4.8:macOS 与 Linux CI 全面转换到 GitHub Actions(#24945、#24955、#24932);为 PMC 发布增加 EV2 支持(#24857);
  • 7.4.9:组件清单生成跳过附加包、仅打包变更时构建 Linux(#25161)。

7.4.10:Windows 执行策略回退

  • 引擎:WldpCanExecuteFile 失败后回退到 AppLocker 检查(#25229)——这是 WDAC/AppLocker 混合策略环境下的关键修复;
  • 构建:MSIXBundle 迁移至 Packages and Release 流水线(#25516);Microsoft.PowerShell.PSResourceGet 升至 1.1.0(#25469);.NET SDK 8.0.408。

7.4.11(2025-06-17)

  • 引擎:.NET 方法调用日志移到方法参数所需类型转换完成之后(#25568)——该调整使 AMSI 方法调用日志记录到的是转换后的最终参数值,对合规审计场景是准确性修复;
  • 构建:.NET SDK 8.0.411;Linux 打包测试改用 ubuntu latest(#25640)。

7.4.12 ~ 7.4.13:安全工具与管线维护

  • 7.4.12:新增 CodeQL 抑制(#25973);ObjectPool、Windows Compatibility、System.Drawing.Common 第三方版本统一到 8.0.19(#26001);.NET SDK 8.0.413;
  • 7.4.13:纯构建管线变更(StableRelease 标记、EV2 镜像换 AzureLinux 3、移除 UseDotnet 任务改用 dotnet-install 脚本、CodeQL 抑制等);.NET SDK 8.0.415。

7.4.14:CI 工具链重构与一个引擎修复

  • 引擎:PSMethodInvocationConstraints.GetHashCode 方法修复(#26959),消除约束对象哈希不稳定的隐患;
  • 工具:linux-ci 工作流增加合并冲突标记检测,并抽出可复用的 get-changed-files action(#26361、#26362);analyze 任务重构为可复用工作流并在 Windows CI 启用(#26342);
  • 测试:修复 $PSDefaultParameterValues 泄漏导致的测试意外跳过(#26869);为 Pester 测试失败添加 GitHub Actions annotations(#26800);增加 PR 的 Markdown 链接校验(#26340);
  • 构建:.NET SDK 8.0.419;用原生 pkgbuild/productbuild(macOS)、rpmbuild(RPM)替代 fpm(#26344、#26337);DEB 生成同样移除 fpm 依赖(#26382)——这完成了 7.4 分支对 fpm 这一外部工具的全面去依赖。

7.4.15:远程 SSH 与更新通知

  • Cmdlet:更新通知延迟一周以确保各渠道包都可用(#27229);创建子 ssh 进程后关闭管道客户端句柄(#27139)——修复 SSH 远程会话建立时父进程句柄泄漏;
  • 构建:.NET SDK 8.0.420;为 LTS 与 Stable 两个通道同时构建 MSIX VPack(#27145、#27187);把 _GetDependencies MSBuild 目标从 build.psm1 动态生成移入 Microsoft.PowerShell.SDK.csproj(#27144);镜像 .NET/runtime 的 ICU 版本范围(#27138)。

7.4.16:Out-GridView 序列化方案落定

  • 引擎:本地用户配置文件路径检查修复(#27454);
  • Cmdlet:PowerShell 遥测在 Windows 上尊重诊断与反馈设置(#27430);Out-GridView 用自定义实现替换已废弃的 BinaryFormatter(#27426)。回顾时间线:preview.5 以 Clone() 方案完成(#20050)→ preview.6 回滚 → 7.4.16 以自定义实现最终定案,体现了 LTS 分支对已废弃 API 的持续治理;
  • 构建:.NET SDK 8.0.421;macOS 二进制代码签名与包公证(notarization)加入发布流程(#27431);Appx 清单增加 appLicensing 能力(#27449);Microsoft.PowerShell.Native 升至最新 GA。

7.4.17 / 7.4.18:收尾版本

  • 7.4.17:代码清理——移除打包模块中未使用的 Publish-NugetToMyGet 命令(#27574);ESRP 签名后立即校验 Apple codesign(#27540);未选通道时跳过 Store 发布(#27571);.NET SDK 8.0.422;
  • 7.4.18:引擎侧解包前校验 CAB 路径(PR 40624),堵住路径类输入验证缺口;CI 工作流开始同时覆盖 servicing-* 分支(#27649);.NET SDK 8.0.423。CAB 路径校验与帮助系统中 CAB 读取代码(如 CabinetAPI.cs)所在目录一致,属于对外部数据输入的防御性加固。

Breaking Changes 汇总与升级注意事项

7.4 全周期共 4 条正式 Breaking Change,全部集中在 preview 阶段,GA 之后未再出现,这正是 preview 阶段的设计价值:

引入版本 变更 影响面
preview.2 新增公共参数 -ProgressAction 几乎所有 Cmdlet 的参数面,扩展绑定逻辑需感知新参数
preview.2 空字符串参数改抛 ArgumentException 依赖异常类型的防御性代码
preview.3 移除 #requires -pssnapin 支持 PowerShell v2 脚本兼容性(预期行为)
preview.4 Test-Json 底层换为 JsonSchema.Net Schema 校验行为细节、第三方依赖引用
preview.4 Test-Connection TCP 输出详情增加 依赖精确输出的脚本
preview.5 Resolve-Path -RelativeBasePath 相对路径处理变更 使用新参数的路径解析逻辑

配套的兼容性契约见仓库的 breaking-change-contract.md,记录了变更的审批与回滚流程。

源码定位速查:从 changelog 条目到仓库文件

将上述版本变更映射到当前仓库的关键文件,便于后续排查与扩展:

小结

CHANGELOG/7.4.md 的完整记录看,7.4 版本线呈现出清晰的三段式演进:preview 阶段(preview.1 ~ rc.1)完成实验特性转正、公共参数扩展与底层引擎替换等全部用户可见变更;GA 绑定 .NET 8 RTM 后,服务补丁期(7.4.1 ~ 7.4.18)以"小步、高频"方式处理回归修复、安全加固(CAB 路径校验、AppLocker 回退、macOS 公证)与发布基础设施现代化(GitHub Actions 化、去 fpm 化、LTS/Stable 双通道 VPack)。对使用者而言,评估 7.4 升级时只需重点核对上文 Breaking Changes 汇总表与 Cmdlet 行为变更条目;对维护者而言,"changelog 条目 → 源码文件"的定位速查表可以直接用于回归测试用例设计与补丁回合(backport)核对。

登录后查看全文
热门项目推荐
相关项目推荐