PowerShell 7.6 版本演进全景解读:从 Changelog 看引擎修复、Cmdlet 增强、实验特性转正与 .NET 10 打包体系重构
本文以 CHANGELOG/7.6.md 为骨架,系统梳理 PowerShell 7.6 系列从 7.6.0-preview.1(2024-12-16)到 7.6.4 的完整变更脉络:破坏性变更、引擎修复、Cmdlet 增强、实验特性转正、DSC v3 Profile 资源,以及构建与打包体系向 .NET SDK 10 和 GitHub Actions 迁移的全过程。读完本文,你可以基于 changelog 快速定位 7.6 各版本的行为差异、掌握新参数的用法(如 Get-Clipboard -Delimiter、Register-ArgumentCompleter -NativeFallback),并结合仓库源码验证关键改动的实现细节。
7.6 版本线概览:一个面向 .NET 10 的 LTS 系列
CHANGELOG/7.6.md 覆盖了以下版本节点(自下而上):
| 版本 | 日期 | 关键定位 |
|---|---|---|
| 7.6.0-preview.1 | 2024-12-16 | 首个预览版,首个 .NET 9 RC 构建 |
| 7.6.0-preview.2 | 2025-01-14 | SDK 9.0.101 |
| 7.6.0-preview.3 | — | CI 迁移 GitHub Actions 的关键节点 |
| 7.6.0-preview.4 | — | ThreadJob 模块改名、变量类型推断大修 |
| 7.6.0-preview.5 | 2025-09-30 | 诊断命名管道、PSForEach/PSWhere 等大批引擎改动 |
| 7.6.0-preview.6 | 2025-12-11 | 包生成弃用 fpm、DSC v3 Profile 资源 |
| 7.6.0-rc.1 | 2026-02-19 | RC 里程碑,SDK 10.0.102 |
| 7.6.0 | — | GA,.NET SDK 10.0.201,PSResourceGet 1.2.0 |
| 7.6.1 | — | SDK 10.0.202,LTS Store 包命名调整 |
| 7.6.2 | — | SDK 10.0.300,macOS 代码签名与公证 |
| 7.6.3 | — | SDK 10.0.301 |
| 7.6.4 | — | SDK 10.0.302,CAB 路径校验 |
从版本节奏可以读出三条主线:
- 运行时主线:构建工具链从 .NET SDK 9.0.101(preview.2)一路升到 10.0.201(GA),维护版本进入 10.0.3xx 服务通道。可以推断 7.6 系列最终锚定 .NET 10 运行时,这与其 LTS(长期支持)定位一致——
7.6.1中"Change the display name of PowerShell-LTS package to PowerShell LTS"(#27219)和 "Update the PhoneProductId to be the official LTS id used by Store"(#27181)都直接服务于 LTS 分发通道。 - 构建迁移主线:Linux、macOS、Windows 的 CI 全部转换为 GitHub Actions workflow(#24913、#24914、#24899),打包流程大量迁移到可复用 workflow 与模板。
- 功能收敛主线:多个实验特性在 preview.1 与 preview.6 两批转正,7.6 是行为收敛的版本。
changelog 本身的组织方式也值得了解:每个版本按 Breaking Changes、Engine Updates and Fixes、General Cmdlet Updates and Fixes、Code Cleanup、Tools、Tests、Build and Packaging Improvements、Documentation and Help Content 分类,构建类长列表折叠在 <details> 中。全系列版本索引见 CHANGELOG/README.md,未发布变更见 CHANGELOG/preview.md,依赖变更追踪在 CHANGELOG/v7.7/dependencychanges.json。
破坏性变更:升级前必读的三处行为改变
7.6 系列标注为 Breaking Changes 的条目很少,但每一条都直接影响既有脚本:
1. ConvertTo-Json 对大枚举值的处理(preview.1,#20999)
大于 Int32.MaxValue 的枚举值现在按数字而非字符串序列化。依赖旧字符串输出的下游解析逻辑需要适配。仓库中该行为与 PSSerializeJSONLongEnumAsNumber 实验特性相关(见 experimental-feature-linux.json),转正后成为默认行为。
2. Join-Path -ChildPath 改为 string[](preview.4,#24677)
参数类型从单值转为字符串数组,Join-Path -ParentPath X -ChildPath a b c 现在可以一次生成多条路径。对显式绑定参数值的托管互操作代码可能产生编译期影响。
3. WildcardPattern.Escape 正确转义孤立反引号(preview.4,#25211)
修复后转义结果与通配符语义一致,依赖旧错误行为的正则/通配符匹配代码可能得到不同结果。
此外还有两处易被忽略的行为变化:
- preview.3:事件源名称去除尾部空格(#24192);
- preview.1:
New-Item -Force传入非法目录名时改为报错(preview.3,#24936)。
preview.4 还伴随一次模块改名:ThreadJob 更名为 Microsoft.PowerShell.ThreadJob v2.2.0,旧名 ThreadJob v2.1.0 保留为代理模块(proxy module)指向新模块,功能无差异。使用 Import-Module ThreadJob 的脚本可继续运行,但建议迁移到新名称。
引擎更新与修复:类型推断、完成机制与诊断管道
变量类型推断的系统性大修
preview.4 是类型推断改动最密集的版本,changelog 中相关条目包括:修复变量类型推断无限循环(#25206)、改进赋值类型推断(#21143)、为无 OutputType 特性与匿名函数补充推断(#21127)、处理重定向命令的推断(#21131)、修复 Do 循环内赋值变量的完成(#25076)、作用域变量无需指定 scope 即可完成(#20340)等;preview.5 又修复了变量类型推断中的另一处无限循环崩溃(#25696)。这些改动直接影响 IntelliSense/Tab 完成的准确度——推断出的类型决定了成员补全候选集。
诊断命名管道与 POWERSHELL_DIAGNOSTICS_OPTOUT
preview.5 引入环境开关:
- 允许通过环境变量
POWERSHELL_DIAGNOSTICS_OPTOUT退出命名管道监听器(#26086)。
仓库源码印证了这一机制的默认开启策略,见 RemoteSessionNamedPipe.cs:
// Unless opt-out, all PowerShell instances will start with the named-pipe listener created and running.
IPCNamedPipeServerEnabled = !Utils.GetEnvironmentVariableAsBool(name: "POWERSHELL_DIAGNOSTICS_OPTOUT", defaultValue: false);
if (IPCNamedPipeServerEnabled)
{
CreateIPCNamedPipeServerSingleton();
CreateProcessExitHandler();
}
即默认(defaultValue: false)每个 pwsh 实例都会启动诊断命名管道单例;设置 POWERSHELL_DIAGNOSTICS_OPTOUT=1 可全局关闭。这与 7.6.2 中"Update PowerShell telemetry to respect the diagnostics and feedback setting on Windows"(#27438)共同构成 7.6 对遥测/诊断数据的用户控制权。同版本还修复了 RemoteHyperVSocket 竞态(#26057)、确保 socket 超时只在 token 校验期间设置(#26066),并对 PSRP 协议弃用新旧客户端/服务器间的 session key 交换(#25774)。
其他引擎级修复
- 别名正确展开为 ResolvedCommand(preview.6,#26571):完成与调用路径解析不再停留在别名层。
stderr输出尊重NO_COLOR(preview.5,#24391):终端着色协议的标准支持。- 原生命令退出码支持十六进制格式(preview.5,#21067):
$LASTEXITCODE相关显示场景。 Cmdlet.PipelineStopToken(preview.4,#24620):新增的CancellationToken,管道停止时被触发,为长循环 Cmdlet 提供及时退出钩子。WldpCanExecuteFile失败后回退到 AppLocker(preview.4,#24912):Windows 执行策略检查更稳健。- 7.6.2:支持在 AppContainer 中使用(#27423)、修复本地用户配置文件路径检查(#27432)。
- 7.6.4:合并 PR 40624 "Validate CAB path before expansion",在帮助 CAB 解压前校验路径,收敛了帮助文件更新路径的处理风险。
通用 Cmdlet 更新与修复:逐项可用的新能力
Get-Clipboard 新增 -Delimiter 参数(preview.6,#25722 系列中的 #26572)
Get-Clipboard 现在可按自定义分隔符把剪贴板文本拆成数组,默认按 Environment.NewLine 拆分。源码实现见 GetClipboardCommand.cs:
[Parameter]
[ArgumentCompleter(typeof(DelimiterCompleter))]
public string[] Delimiter { get; set; } = [Environment.NewLine];
非 -Raw 模式下执行 textContent.Split(Delimiter, StringSplitOptions.None),-Raw 则原样返回整段文本。值得注意的是配套的 DelimiterCompleter(GetClipboardCommand.cs):在参数值位置输入 Tab 时提供 "CRLF"(Windows)与 "LF"(UNIX)两个候选,分别展开为 "`r`n" 与 "`n"。实用示例:
# 默认:按换行拆分成数组
Get-Clipboard
# 按 CRLF 显式拆分(参数值处按 Tab 可补全出 CRLF/LF 候选)
Get-Clipboard -Delimiter "`r`n"
# 整段原样返回
Get-Clipboard -Raw
Register-ArgumentCompleter 新增 -NativeFallback(preview.5,#25230)
该参数支持为原生命令(外部 exe)注册"全覆盖"补全器,当没有更具体的补全规则命中时由其兜底。参数定义位于 ExtensibleCompletion.cs:
# 为所有原生命令兜底补全(例如枚举项目根目录下的 .sln 文件)
Register-ArgumentCompleter -CommandName '*' -NativeFallback -ScriptBlock {
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
Get-ChildItem -Filter "*.sln" | ForEach-Object { $_.Name }
}
7.6 系列中值得注意的 Cmdlet 行为修复
- preview.5:
ConvertFrom-Json忽略数组字面量内部注释(#14553);-Debug不再触发ShouldProcess确认提示(#26081);Write-Host尊重OutputRendering = PlainText(#21188);Invoke-Command的$using:表达式支持改进(#24025);Out-GridView用自定义实现替换已过时的BinaryFormatter(#25497);反馈提供器默认超时从 300ms 提升到 1000ms(#25910);bigint类型转换支持千位分隔符(#25396);Join-Path补全器支持单双引号(#25283)。 - preview.3:
Start-Transcript允许传入包裹了字符串的$TranscriptPSObject(#24963);Start-Process -Wait轮询效率改进(#24711)。 - preview.2:
Get-Command新增-ExcludeModule参数(#18955);Get-Item列出备用数据流时返回正确的FileName(#18019);New-ItemProperty新增-PropertyType参数补全(#21117);AIShell模块加入遥测采集列表(#24747)。 - preview.1:
Resolve-Path与Convert-Path新增-Force以支持通配隐藏文件(#20981);符号链接目标相对链接自身而非工作目录解析(#15235);Get-PSSession -ComputerName在 Unix 上给出明确错误(#21009);Copy-Item/Remove-Item延迟显示进度条(#24013);$PSHOME在找不到 SMA.dll 时改用宿主 exe 位置判定(#24072)。 - 7.6.1:更新通知延迟一周,确保各渠道包都可用后再提示(#27215)。
内置方法别名 PSForEach 与 PSWhere
preview.5(#25511)为 PowerShell 内置方法 Where 与 Foreach 添加别名 PSWhere、PSForEach,用途是避免与 Windows PowerShell 遗留命令或 ForEach-Object 产生歧义:
[0..9] | Where-Object { $_ % 2 -eq 0 }
[0..9].Where({ $_ % 2 -eq 0 }) # 内置方法
[0..9].PSWhere({ $_ % 2 -eq 0 }) # 等价别名
[0..9].ForEach({ $_ * 2 })
[0..9].PSForEach({ $_ * 2 }) # 等价别名
仓库中配套补充了测试("Add more tests for PSForEach and PSWhere methods",#25519,见 test 目录下 Language 相关用例)。
实验特性转正:7.6 的行为固化节点
7.6 两批转正了多个实验特性,这对 LTS 用户尤其重要——转正意味着行为成为契约:
- preview.1(#24246):
PSCommandNotFoundSuggestion(命令未找到建议)、PSCommandWithArgs(带参命令)、PSModuleAutoLoadSkipOfflineFiles(自动加载跳过离线文件)转正。 - preview.6(#26490、#26502):若干实验特性转正,其中
PSFeedbackProvider明确点名转正。
仓库根目录的 experimental-feature-linux.json 展示了当前主线(7.7 开发线)仍保留的实验特性清单,其中 PSProfileDSCResource、PSSerializeJSONLongEnumAsNumber 等条目与 7.6 的转正记录形成对照:
[
"PSFeedbackProvider",
"PSLoadAssemblyFromNativeCode",
"PSNativeWindowsTildeExpansion",
"PSProfileDSCResource",
"PSSerializeJSONLongEnumAsNumber",
"PSRedirectToVariable",
"PSSubsystemPluginModel"
]
Windows 侧清单见 experimental-feature-windows.json。维护者可用 Get-ExperimentalFeature 在已安装实例上核实各特性的启用状态(PSFeedbackProvider 转正后应出现在已稳定列表中)。
DSC v3 的 PowerShell Profile 资源
preview.6 带来 "DSC v3 resource for PowerShell Profile"(#26447),7.6.0 又跟进 "Update PowerShell Profile DSC resource manifests to allow null for content"(#26973)。该资源允许用 Desired State Configuration v3 声明式管理 pwsh 配置文件,跨 Linux/Windows/macOS。
仓库内即包含该资源的完整实现:清单 dsc/pwsh.profile.dsc.resource.json 与实现脚本 dsc/pwsh.profile.resource.ps1。从清单可见:
- 资源类型为
Microsoft.PowerShell/Profile,get/set/export 三操作统一通过pwsh -NoLogo -NonInteractive -NoProfile -ExecutionPolicy Bypass -File ./pwsh.profile.resource.ps1 -operation <op>执行,输入走 stdin; - 退出码语义:
0成功、1错误、2export 不支持输入; - 核心属性:
profileType(必填,枚举AllUsersCurrentHost、AllUsersAllHosts、CurrentUserAllHosts、CurrentUserCurrentHost)、content(字符串或null)、profilePath(只读)、_exist/_name(DSC v3 通用属性)。
content 的取值语义(对应 7.6.0 允许 null 的变更)为:不指定该属性时资源不管理文件内容;指定为空字符串时清空文件内容;指定为非空字符串时写入内容,且换行符原样保留。据此可以写出典型的 DSC v3 配置:
{
"resources": [
{
"type": "Microsoft.PowerShell/Profile",
"properties": {
"profileType": "CurrentUserAllHosts",
"content": "$ErrorActionPreference = 'Stop'\n",
"_exist": true
}
}
]
}
这一资源对批量管理开发机/CI 镜像的 pwsh 环境(统一 $ErrorActionPreference、加载模块、设置别名)提供了无 Agent 的声明式手段,配合 7.6 的 LTS 定位适合长期基线。
构建与打包体系:.NET SDK 10、GitHub Actions 与多渠道分发
changelog 中最长也最"工程化"的部分是 Build and Packaging Improvements。7.6 的打包体系经历了系统性重构,要点如下:
工具链与 SDK 演进
- preview.2 锚定 .NET SDK 9.0.101;preview.5 期间经历了 .NET 10 Preview 4/6/7、10.0.100-rc.1 等多次跟随升级;rc.1 固定到 10.0.102;GA 使用 10.0.201;维护版本 7.6.2/7.6.3/7.6.4 分别升到 10.0.300/10.0.301/10.0.302——10.0.3xx 即 .NET 10 的 servicing 波段。
- C# 语言版本锁定:
LangVersion在 test/Test.Common.props 相关配置中设为 13.0(#24617、#24619、#24621)。 - 依赖包升级贯穿始终:PSReadLine 2.3.6 → 2.4.4-beta4 → 2.4.5;
Microsoft.PowerShell.PSResourceGet1.1.0 → 1.2.0;WCF 包更新到与 v4.10.3 兼容的版本;Microsoft.PowerShell.Native跟随 GA 版本。
CI/CD 迁移到 GitHub Actions
- preview.3 将
PowerShell-CI-linux、PowerShell-CI-macos、PowerShell-Windows-CI三个 ADO 流水线转换为 GitHub Actions workflow(#24913、#24914、#24899); - preview.4/5 持续补全:PR 标签校验 workflow(#25145)、基于 dotnet/arcade 的 backport workflow(#25106)、markdown 链接校验(preview.6,#26445)、Pester 失败注解(7.6.0,#26969)、CodeQL 抑制规则(#25943、#26132)、安全加固(Harden GitHub Actions tags/tokens,#27236、#27218);
- 构建侧:ready-to-run 仅在 Release 配置启用(#26481)、
build.psm1增加日志分组以折叠 GitHub Actions 日志(#26524)、_GetDependenciesMSBuild target 从build.psm1动态生成移入 Microsoft.PowerShell.SDK.csproj(#27177)、PSVersionInfo源码生成器替换为增量生成器(#23815)。
包生成:弃用 fpm,转向原生工具
preview.6 完成了包生成工具链去 fpm 化:
- macOS 改用
pkgbuild/productbuild(#26501); - RPM 改用原生
rpmbuild(#26441); - DEB 生成移除 fpm 依赖(#26504),并为 Debian 13 增加
libicu76依赖(#25866)。
后续维护版本继续扩展平台覆盖:7.6.0 新增 debian13 与 rhel10 的 PMC 包(#26917);7.6.2 增加 arm 架构 Debian 包(#27433)、macOS 二进制代码签名与包公证(#27434)、Appx 清单加入 appLicensing capability(#27437,对应 assets/AppxManifest.xml)、为 LTS 与 Stable 通道同时生成 VPack 的 MSIXBundle-VPack 流水线(#27435)。发布渠道侧,Store 发布自动化(#25725)、NuGet 发布独立为 git tag 之后的独立 stage(#27652)、macOS LTS/非 LTS 双包(#27040)、metadata.json 中 LTS 与 Stable 发布设置更新(#27006,对应 tools/metadata.json)等,共同支撑 7.6 作为 LTS 的多渠道(GitHub、NuGet、PMC、Store)分发。
签名与合规
- Windows:
pwsh.exe签名(#24219,曾在 preview.1 期间短暂 revert 后重做 #25586)、APIScan 接入 CodeQL(#24303)、TSConfig 问题路径细化(#24244)、强命名 token 计算移除 MD5 分支(#24288); - macOS:7.6.3 起在 ESRP 签名后立即校验 Apple codesign(#27542);
- 合规清单:TPN 清单与 Component Governance 清单拆分(#26978),
cgmanifest.json中 NuGet 包版本修正为与分支一致(#26982),PMC 发布下载 deb_arm 工件确保包可用(#27653)。
测试与代码清理
测试侧的变更保障了上述功能改动的可信度:PSNativeCommandArgumentPassing 测试修复(7.6.1,#27179)、Arm32 平台下 Import-Module.Tests.ps1 修复(7.6.0,#26888)、$PSDefaultParameterValues 泄漏导致测试意外跳过的修复(rc.1,#26705)、CompletionHelpers.HandleDoubleAndSingleQuote 的 XUnit 测试(preview.4,#25181,测试位于 test/xUnit 目录)、三个持续失败测试标记为 pending 以解锁 PR(preview.5,#26091)。
代码清理以 @xtqqczze 的贡献为主,规模可观:批量移除过时 Roslyn 分析规则抑制(CA1026、CA1059、CA1701、CA1703、CA2105、CA2118、CA2233、CA2240 等)、为 Microsoft.PowerShell.Commands.Utility/Microsoft.PowerShell.Commands.Management/PlatformInvokes 的内部类型加 sealed、统一文件末尾换行规范、用 SearchValues<char> 替换补全热路径上的 char[]/IndexOfAny 调用(#24879、#24880、#24907)。这类清理直接服务于补全性能的长期可维护性,与 preview.4 的补全机制大修(CompletionHelpers 类抽取,#25138)形成呼应。
如何持续跟踪 7.6 与 7.7
- 已发布版本:直接读 CHANGELOG/7.6.md 对应小节;每条 PR 编号(如 #26572)可用于在仓库 issue/PR 系统中检索完整讨论与 diff;
- 开发中变更:CHANGELOG/preview.md 是未发布变更的滚动记录(例如
PSFeedbackProvider转正在 preview 线亦有对应条目); - 依赖基线变化:CHANGELOG/v7.7/dependencychanges.json 记录 7.7 线的依赖变更;
- 发布通道元数据(LTS/Stable 版本号):tools/metadata.json。
小结
7.6 系列 changelog 呈现出一个 LTS 版本的典型形态:功能增量克制(少量破坏性变更 + 明确的实验特性转正)、引擎修复聚焦类型推断与补全、DSC v3 Profile 资源补齐声明式运维能力、构建体系完成 .NET SDK 10 与 GitHub Actions 的迁移并扩展 debian13/rhel10/ARM 等平台覆盖。对升级者而言,先核对三处破坏性变更与 ThreadJob 模块改名,再按小节定位与自身脚本相关的 Cmdlet 行为变化,是最高效的路径;每一条结论均可回溯到 CHANGELOG/7.6.md 的 PR 编号与仓库内对应源码文件进行验证。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00