首页
/ PowerShell 7.6 版本演进全景解读:从 Changelog 看引擎修复、Cmdlet 增强、实验特性转正与 .NET 10 打包体系重构

PowerShell 7.6 版本演进全景解读:从 Changelog 看引擎修复、Cmdlet 增强、实验特性转正与 .NET 10 打包体系重构

2026-09-05 11:36:26作者:羿妍玫Ivan

本文以 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 -DelimiterRegister-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 路径校验

从版本节奏可以读出三条主线:

  1. 运行时主线:构建工具链从 .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 分发通道。
  2. 构建迁移主线:Linux、macOS、Windows 的 CI 全部转换为 GitHub Actions workflow(#24913、#24914、#24899),打包流程大量迁移到可复用 workflow 与模板。
  3. 功能收敛主线:多个实验特性在 preview.1 与 preview.6 两批转正,7.6 是行为收敛的版本。

changelog 本身的组织方式也值得了解:每个版本按 Breaking ChangesEngine Updates and FixesGeneral Cmdlet Updates and FixesCode CleanupToolsTestsBuild and Packaging ImprovementsDocumentation 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 则原样返回整段文本。值得注意的是配套的 DelimiterCompleterGetClipboardCommand.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.5ConvertFrom-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.3Start-Transcript 允许传入包裹了字符串的 $Transcript PSObject(#24963);Start-Process -Wait 轮询效率改进(#24711)。
  • preview.2Get-Command 新增 -ExcludeModule 参数(#18955);Get-Item 列出备用数据流时返回正确的 FileName(#18019);New-ItemProperty 新增 -PropertyType 参数补全(#21117);AIShell 模块加入遥测采集列表(#24747)。
  • preview.1Resolve-PathConvert-Path 新增 -Force 以支持通配隐藏文件(#20981);符号链接目标相对链接自身而非工作目录解析(#15235);Get-PSSession -ComputerName 在 Unix 上给出明确错误(#21009);Copy-Item/Remove-Item 延迟显示进度条(#24013);$PSHOME 在找不到 SMA.dll 时改用宿主 exe 位置判定(#24072)。
  • 7.6.1:更新通知延迟一周,确保各渠道包都可用后再提示(#27215)。

内置方法别名 PSForEachPSWhere

preview.5(#25511)为 PowerShell 内置方法 WhereForeach 添加别名 PSWherePSForEach,用途是避免与 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 开发线)仍保留的实验特性清单,其中 PSProfileDSCResourcePSSerializeJSONLongEnumAsNumber 等条目与 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 错误、2 export 不支持输入;
  • 核心属性:profileType(必填,枚举 AllUsersCurrentHostAllUsersAllHostsCurrentUserAllHostsCurrentUserCurrentHost)、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# 语言版本锁定:LangVersiontest/Test.Common.props 相关配置中设为 13.0(#24617、#24619、#24621)。
  • 依赖包升级贯穿始终:PSReadLine 2.3.6 → 2.4.4-beta4 → 2.4.5;Microsoft.PowerShell.PSResourceGet 1.1.0 → 1.2.0;WCF 包更新到与 v4.10.3 兼容的版本;Microsoft.PowerShell.Native 跟随 GA 版本。

CI/CD 迁移到 GitHub Actions

  • preview.3 将 PowerShell-CI-linuxPowerShell-CI-macosPowerShell-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)、_GetDependencies MSBuild 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 分析规则抑制(CA1026CA1059CA1701CA1703CA2105CA2118CA2233CA2240 等)、为 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 编号与仓库内对应源码文件进行验证。

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

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
983
503
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384