PowerShell 6.0 版本演进全解:从 0.1.0 到 6.0.0 的跨平台化、CoreCLR 化与破坏性变更清单
PowerShell 6.0 版本演进全解从 0.1.0 到 6.0.0 的跨平台化、CoreCLR 化与破坏性变更清单【免费下载链接】PowerShellPowerShell for every system!项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell本文基于仓库中的 CHANGELOG/6.0.md6.0 全生命周期变更日志覆盖 2016 年 2 月至 2018 年 1 月共 30 余个版本展开系统梳理 PowerShell 从 Windows 专属工具演进为跨平台引擎的关键里程碑.NET Standard 2.0 引入带来的 Windows PowerShell 模块兼容、执行器改名pwsh、CoreCLR 单轨化等破坏性变更的完整清单以及管道后台化、字符范围运算符等代表性新特性并结合当前仓库源码如 InitialSessionState.cs、NumericOps.cs、Telemetry.cs佐证这些变更的真实落地位置帮助读者完成版本核对与迁移评估。文档定位与版本时间线总览CHANGELOG/6.0.md 按时间倒序记录了 PowerShell 6.0 的完整开发历程版本编号遵循语义化版本SemVer的预发布惯例阶段版本范围时间主线工作0.x 预研0.1.0 ~ 0.6.02016-02 ~ 2016-07首批跨平台移植Windows / OS X / Ubuntu.NET Core 1.0Alpha6.0.0-alpha.7 ~ alpha.182016-07 ~ 2017-04命令集补齐、跨平台修复、JEA/遥测基础Beta6.0.0-beta.1 ~ beta.92017-05 ~ 2017-10转向 .NET Core 2.0、Windows 模块兼容、改名pwshRC6.0.0-rc / rc.22017-11 ~ 2017-12收尾修复、合规工作、去除 Pester 捆绑GA6.0.02018-01-10正式发布该文件与 CHANGELOG/README.md 中的版本索引6.0 ~ 7.7 各版本及 preview 变更日志共同构成仓库的版本档案体系。需要说明的是当前仓库源码快照已演进到远晚于 6.0 的版本global.json 指定 .NET SDK 11.0.100-previewDotnetRuntimeMetadata.json 指向 .NET 9 运行时本文在引用源码佐证时会明确区分6.0 时期的行为与当前仓库中的现状。演进主线一运行时底座迁移.NET Core 1.0 → 1.1 → 2.0变更日志显示6.0 的每一步都伴随运行时底座的升级这是理解后续所有兼容性变化的前提0.6.02016-07目标锁定 .NET Core 1.0 正式版启用 PowerShellGet修正AssemblyLoadContext依赖拦截与类型目录问题。0.5.02016-06路径分隔符不再区分/与\遵循 XDG Base Directory 规范Linux/OS X 上 profile 固定为~/.config/powershell/profile.ps1历史记录位于~/.local/share/powershell/PSReadLine/ConsoleHost_history.txt用户模块路径为~/.local/share/powershell/Modules并废弃了旧的~/.powershell目录。6.0.0-alpha.142016-12整体迁移到 .NET Core 1.1。6.0.0-beta.12017-05迁移到.NET Core 2.0即引入 .NET Standard 2.0PR #3556。变更日志原文指出其价值在 Windows PowerShell基于完整 .NET Framework与 PowerShell Core基于 .NET Core之间拥有通用的、可移植的模块——过去无法运行的模块和 cmdlet 在 .NET Core 2.0 上可能直接可用。6.0.0-beta.62017-08切换到 .NET Core 2.0 final。6.0.0-rc.22017-12进一步升级到 2.0.4 运行时并移除所有指向旧可执行文件powershell/powershell.exe的引用。演进主线二Windows PowerShell 模块向后兼容beta.1 ~ beta.4 的组合拳变更日志中最具实战价值的部分是 6.0.0-beta.4 专门开辟的 Windows PowerShell backwards compatibility 小节它与前两个版本的改动叠加构成让存量 Windows PowerShell 模块直接在 PowerShell Core 上工作的三要素.NET Standard 2.0beta.1 引入模块程序集可跨运行时共享GAC 探测修复beta.3 引入PR #3981允许从 GAC 探测并加载程序集即可加载依赖 GAC 程序集的 Windows PowerShell 模块。变更日志甚至给出了手动验证方法$env:PSModulePath ;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules默认合并 PSModulePathbeta.4 引入PR #4132在 Windows 上把 Windows PowerShell 的模块目录自动加入默认的$PSModulePath使大量现有模块/脚本开箱即用同时修复了 beta.2 中 CDXML 模块回归PR #4144。同期配套的引擎修复还包括SemanticVersion与只含 Major/Minor 的Version实例之间的比较修复导入旧 Windows PowerShell 模块的失败场景PR #3793、非 Windows 平台Import-Module支持NestedModules/RootModulesPR #4010等。破坏性变更完整清单升级前必读6.0 的 Breaking changes 散布在各版本中按主题归并如下这也是本文对变更日志最有价值的重组执行器与调用方式可执行文件由powershell改名为pwshbeta.9PR #5101这是 6.0 最著名的重命名后续大量 CI/文档/安装脚本变更appimage、macOS launcher、VSCode 配置、man page 等都是围绕它展开的连锁改动。位置参数由-Command改为-Filebeta.3PR #4019修复了非 Windows 平台上脚本 shebang#!无法工作的问题此后pwsh foo.ps1无需-File但相应地执行命令必须显式写-c/-Command。移除sc别名6.0.0 GAPR #5827与系统命令sc.exe冲突。在当前仓库源码中可以看到这一决策的落地形态InitialSessionState.cs 中sc别名的注册被包裹在#if !CORECLR预处理块内与gwmi/iwmi等一同即 CoreCLR 构建6.0 起的全部构建都不会注册该别名。-File/-Command错误信息与退出码对齐 Unix 规范beta.6PR #4573。移除powershell.exe的-ImportSystemModules与-PSConsoleFile参数以及凭据 GUI 弹窗代码beta.9PR #4995。参数与行为$OutputEncoding默认值由 ASCII 改为 UTF-8无 BOMrcPR #5369。Export-Csv/ConvertTo-Csv默认启用-NoTypeInformationbeta.9PR #5164。Get/Set/Remove-Service移除-ComputerNamebeta.9PR #5094同理.NET Core的Process.GetProcesses(computer)只返回本地进程-ComputerName支持被整体移除PR #4960。Remove-AllScope出大多数默认别名rcPR #5268降低新建作用域的开销。-Verbose不再覆盖$ErrorActionPreferencercPR #5113Get-Item -LiteralPath a*b在通配不命中时如实报错rcPR #5197。Web Cmdlets 安全收紧遗留凭据走非 HTTPS 传输时直接报错rcPR #5402Invoke-RestMethod单值 JSONnull解析修复rcPR #5338。$PSVersionTable瘦身beta.3移除BuildVersion与ClrVersion两个属性官方建议改用GitCommitId精确定位构建版本。架构级移除移除RunspaceConfiguration支持beta.9PR #4942这是 5.1 时代遗留的受限会话配置机制移除后Register-PSSessionConfiguration等统一走新模型。CoreCLR 单轨化变更日志在 beta.5、beta.6 明确声明 PowerShell 6.0 将完全构建于 CoreCLR 之上随之大规模删除仅 FullCLR 编译的代码#if CORECLR清理专题并移除 Workflow 代码beta.7PR #4777、未使用的 PSMI 代码beta.9PR #5075等。这也解释了为什么当前仓库中仍存在#if !CORECLR历史分支——它们只服务于非 CoreCLR 的构建目标。模块移除Microsoft.PowerShell.Diagnostics的*-Counter命令beta.5PR #4303与Microsoft.PowerShell.LocalAccountsbeta.5PR #4302因依赖暂不可用的 API 被整体摘除待更好方案出现后再回归。代表性新特性与源码佐证管道末尾后台化为 Jobbeta.2PR #3360变更日志给出的语义流水线末尾加会将其作为 PowerShell Job 运行并返回 Job 对象此后所有标准*-Jobcmdlet 均可接管流水线中引用的变量进程特定变量除外会自动拷贝进 Job因此Copy-Item $foo $bar 可直接工作且 Job 运行在当前目录而非用户主目录。这使得 Linux/OS X 用户无需Start-Job即可获得类 shell 的后台执行体验。a..z字符范围运算符rcPR #5026..运算符新增 char 重载a..z返回 a 到 z 的字符序列。当前仓库中该能力由 NumericOps.cs 的internal static object[] Range(char start, char end)实现与整型范围共用同一入口。Web Cmdlets 的能力扩张贯穿各版本变更日志显示 Web Cmdlets 是 6.0 中改动最密集的模块能力演进脉络清晰认证证书认证beta.6PR #4646→-AuthenticationBasic/OAuth/Bearer-Token-AllowUnencryptedAuthenticationbeta.9PR #5052传输-SslProtocol指定 SSL 协议rcPR #5329、Multipart 内容beta.8PR #4782、Link header 分页——Invoke-RestMethod提供-FollowRelLink自动跟随next链接并配合-MaximumFollowRelLink限次beta.2PR #3828、-NoProxy忽略系统代理alpha.18PR #3447请求头控制-SkipHeaderValidationbeta.5PR #4085、-ResponseHeadersVariable捕获响应头beta.8PR #4888、UserAgent从WindowsPowerShell统一为PowerShellbeta.8PR #4914。遥测的引入与退出机制beta.1PR #36206.0.0-beta.1 首次在 ConsoleHost 引入极简遥测仅上报两个值操作系统平台$PSVersionTable.OSDescription与精确版本$PSVersionTable.GitCommitId。退出机制为删除$PSHome\DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY文件且在 PowerShell 首次运行前删除同样生效。作为对照当前仓库的遥测实现 Telemetry.cs 中可见后续演进出的环境变量退出方式POWERSHELL_TELEMETRY_OPTOUT——读者在较新版本上应优先使用环境变量的退出方式。文件系统语义向 Unix 靠拢beta.1 集中修复用操作系统调用判断两个路径是否指向同一文件修复 Unix 大小写敏感路径被当作不敏感的问题PR #3441New-Item支持指向文件/目录乃至不存在目标的符号链接PR #3509Remove-Item作用于符号链接时只删除链接本身PR #3637Get-ChildItem在 Unix 上列出目录链接的内容PR #3697后又对齐ls -R/DIR /S的递归语义——返回链接本身但不遍历其目标目录beta.2PR #3780并新增按需跟随链接且带环检测的-FollowSymlink参数beta.4PR #4020Rename-Item支持 Unix glob 模式PR #3661。其他值得留意的引擎改进原生命令通配展开Unix 上支持ls *.txtbeta.1PR #3643-i交互开关beta.1PR #3558方便把 PowerShell 设为默认 shell长路径支持超过 260 字符beta.3PR #3960Unicode 转义解析可用 Unicode 字符作参数、字符串甚至变量名beta.4PR #3958GitCommitId直接显示在启动横幅beta.3PR #3916免去每次都运行$PSVersionTable$IsOSX改名$IsMacOSbeta.7PR #4757执行策略组策略安全检査性能提升beta.1PR #25886.0.0 GA 阶段2018-01-10还包含分离组策略设置并启用策略受控日志PR #5791、修复 Unix 平台libpsrpclient的DllImport失败处理PR #5622。测试基础设施演进从 httpbin.org 到自建 WebListener6.0 的变更日志有一条贯穿始终的工程线用自建的 WebListener 测试服务替换对外部站点httpbin.org、lee.io的依赖覆盖 headers、user-agent、redirect、encoding、delay、gzip/deflate、证书认证、HTTPS 等全部 Web Cmdlets 场景分散在 alpha.18 ~ 6.0.0 GA 的多个 PR 中如 PR #5035、#4622、#4733、#4738、#5058、#5540、#5665、#5709。其动机是外部站点不可控导致的 CI 抖动。当前仓库中该模块完整保留在 test/tools/WebListener含 Program.cs、Controllers 目录及支持 Gzip/Deflate/Brotli 压缩的过滤器说明这套本地化测试端点的思路一直沿用至今。同期还有Docker 容器验证发布包PR #5401、Travis CI 矩阵与 PR 标签[package]tag 触发打包、Windows 安装程序仅在 Windows 上跑测试PR #5619等 CI 改进。打包、安装与合规变更日志的 Build and Packaging 小节记录了 6.0 分发形态的定型过程对运维与 CI 场景有直接参考价值跨平台统一安装脚本install-powershell.ps1由纯 Windows 脚本演进为跨平台脚本PR #5411install-powershell.sh支持 Amazon LinuxPR #5461当前仓库的 tools/install-powershell.ps1 与 tools/install-powershell.sh 即其延续ARM 支持启用win-arm/win-arm64构建PR #5524新增linux-armtarball 包PR #5652支持 Raspbiantar.gz打包PR #5387与树莓派 arm32 交叉编译beta.7PR #4742Windows 安装包MSI 支持升级而非并行安装beta.5PR #4259、x86/x64 包互不覆盖GA 阶段PR #5812、RCEdit嵌入图标与版本信息rcPR #5178、requestedExecutionLevel设为asInvoker并添加HighEntropyVA合规工作PR #5285、#5455macOS包要求 10.12 及以上PR #5649提供 launcherbeta.9PR #5138使用 Uniform Type Identifier 对齐 Apple 规范PR #5323Pester 解耦6.0.0-rc.2 起 Pester 不再随 PowerShell 包分发需Install-Module Pester自行安装PR #5623、#5631合规Compliance工作变更日志专设小节说明这是微软继续以官方包形式签署发布的必要工作包括移除未使用的PerformWSManPluginReportCompletion、以strnlen替换strlenPR #5510等。迁移核对清单如何用当前仓库验证 6.0 行为基于上述证据升级/回滚评估时可按以下要点核对执行器名所有powershell/powershell.exe调用在 6.0 起应为pwsh仓库内 assets/manpage/pwsh.1 即新可执行文件的手册页。版本指纹不要再读$PSVersionTable.BuildVersion/ClrVersion已移除改用GitCommitId启动横幅已自带该信息。脚本位置参数pwsh -File script.ps1或直接pwsh script.ps1执行命令片段需显式-Command。模块路径确认$PSModulePath中是否包含 Windows PowerShell 模块目录Windows 上默认已合并这是存量模块兼容的关键开关。CSV 输出与编码默认不再携带#TYPE行-NoTypeInformation默认开启$OutputEncoding默认为 UTF-8 无 BOM。别名清理sc等与系统二进制冲突的别名不再可用$IsOSX应替换为$IsMacOS。远程服务操作*-Service类 cmdlet 不再接受-ComputerName跨机操作需改走 PowerShell Remoting。延伸阅读后续版本的变更日志CHANGELOG/6.1.md、CHANGELOG/6.2.md、CHANGELOG/7.0.md 等索引见 CHANGELOG/README.md仓库根目录的 CHANGELOG.md 为当前开发线preview日志。构建文档docs/building/internals.md、docs/building/linux.md、docs/building/windows-core.md。引擎关键源码默认别名与启动内建脚本定义于 InitialSessionState.cs范围运算符运算实现见 NumericOps.cs遥测退出开关见 Telemetry.cs。【免费下载链接】PowerShellPowerShell for every system!项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考