Skip to content

PowerShell 7 是干嘛的?要不要升级?与 Windows PowerShell 5.1 的区别和共存关系

TL;DR

PowerShell 7(pwsh)是微软目前主力维护的现代版 PowerShell,与 Windows 自带的 PowerShell 5.1(powershell)是两个独立程序,装上后并存、互不覆盖。写脚本、用 oh-my-posh 美化终端、做跨平台开发的人建议装;只偶尔敲一两条命令的可以不装。免管理员一键安装:hudo install pwsh

PowerShell 7 是干嘛用的?和系统自带的是什么关系?

PowerShell 7 是微软当前主力开发的跨平台 shell 与脚本语言,可执行文件叫 pwsh.exe;它和 Windows 自带的 Windows PowerShell 5.1(powershell.exe)是两个独立程序,安装后二者并存,互不影响。

背景是这样的:Windows 10/11 预装的 Windows PowerShell 5.1 发布于 2016 年,是基于 .NET Framework 的最后一个大版本,此后微软不再为它开发新功能,只做安全维护。开发重心转移到了开源、跨平台的新实现上——先叫 PowerShell Core 6,从 7.0 起去掉 Core 后缀,就是今天的 PowerShell 7,基于现代 .NET 运行时,Windows、Linux、macOS 都能跑。

因为两者可执行文件名不同(powershell vs pwsh)、安装目录也不同(前者在 System32 里,后者装到 Program Files 或自选目录),装 PowerShell 7 并不会"升级掉"5.1:在终端敲 powershell 进的还是 5.1,敲 pwsh 进的才是 7。所以"要不要升级"其实是个伪问题——这不是替换升级,是多装一个更好用的,旧的原地不动。

PowerShell 7 和 5.1 到底差在哪?

一句话:5.1 停在 2016 年的语法和 .NET Framework 上,PowerShell 7 拿到了这十年间的全部新特性。对写命令和脚本的人来说,差距集中在这几处:

对比项Windows PowerShell 5.1PowerShell 7
可执行文件powershell.exepwsh.exe
运行时.NET Framework 4.x现代 .NET(8+)
更新状态仅安全维护,无新功能活跃开发
&& / || 链式操作符不支持(解析报错)7.0 起支持
三元运算符 ? :不支持7.0 起支持
null 合并 ??不支持7.0 起支持
ForEach-Object -Parallel 并行不支持7.0 起支持
重定向写文件默认编码UTF-16 / ANSI 混杂统一 UTF-8(无 BOM)
平台仅 WindowsWindows / Linux / macOS
获取方式系统预装需自行安装

表格之外,两个最容易在日常撞上的点值得展开:

第一是 &&。几乎所有开源项目的 README 都写 npm install && npm run dev 这类命令,粘进 5.1 会直接报"标记 '&&' 不是此版本中的有效语句分隔符"——不是你的操作有问题,是 5.1 真的不认识它,这个操作符 7.0 才加上。

第二是编码。5.1 里 > 重定向默认写出 UTF-16LE,Set-Content 默认 ANSI(中文系统就是 GBK),同一段脚本写出的文件编码互相都不一致,交给 Git 或别的工具处理就是乱码现场;PowerShell 7 把默认编码统一成了无 BOM 的 UTF-8,跟现代工具链对齐。

要不要升级?谁需要,谁无所谓?

判断标准很简单:你会不会把终端当工具用。会,就装;不会,5.1 留着当应急壳子就够了。

建议装的人:

  • 写 PowerShell 脚本的人——&&、三元、?? 这些新语法加上并行 ForEach,脚本量大时并行一项就值回票价;而且 5.1 除了安全补丁不会再有任何改进
  • 想美化终端的人——oh-my-posh 等主流终端美化教程默认你用的是 PowerShell 7,在 5.1 上照做容易卡在半路,具体见 Windows Terminal 美化教程
  • 常从 README 粘命令、常用现代 CLI 工具的人——&& 报错会天天烦你
  • 跨平台开发者——同一份脚本在 Windows / Linux / macOS 上通用

无所谓的人:

  • 一年打开终端的次数一只手数得过来,只跑 ipconfigping 这类命令
  • 生产脚本依赖某些只在 5.1 下验证过的 Windows 专属管理模块的运维场景(7 有兼容层,但关键脚本谨慎为先)

装了也不亏:两者共存,代价只是一点磁盘空间。

怎么安装 PowerShell 7?三种方式选哪个?

结论:想省事用 winget,要离线包或更新选项用官方 MSI,账户没有管理员权限就用 hudo 便携版。版本号以官网最新为准。

方式一:winget 一条命令

Windows 10/11 自带 winget,一条命令搞定:

powershell
winget install --id Microsoft.PowerShell --source winget

默认机器级安装到 C:\Program Files\PowerShell\7\,过程中会弹一次 UAC 提权确认。以后升级用 winget upgrade Microsoft.PowerShell

方式二:官方 MSI 安装包

适合离线环境或想控制安装选项的人。到 GitHub 的 PowerShell Releases 页面下载 PowerShell-7.x.x-win-x64.msi,双击安装。安装向导里可以勾选"通过 Microsoft Update 获取更新",勾上之后版本就跟着系统更新走,不用手动维护。同样需要管理员权限。

方式三:hudo 便携版(免管理员)

如果你的账户没有管理员权限,或者不想在注册表里留痕迹,可以用 hudo——一个支持 26 款工具一键安装的 Windows 开发环境引导工具:

powershell
# 先装 hudo(如果还没有)
irm hudo.zexa.cc/install.ps1 | iex

# 装 PowerShell 7
hudo install pwsh

hudo 用的是官方 zip 便携版,装到 {安装盘}\hudo\tools\pwsh\,全程用户态、不弹 UAC,自动把路径写进用户 PATH;卸载时 hudo uninstall pwsh 删目录加清 PATH,不碰注册表。需要锁定版本可以在配置文件里写 pwsh = "7.6.4"。完整参数见 PowerShell 7 工具页

装完后新开一个终端验证:

powershell
pwsh -Version

怎么把 Windows Terminal 的默认终端换成 PowerShell 7?

路径是:Windows Terminal 设置(Ctrl+,)→ 启动 → 默认配置文件 → 选 "PowerShell"。注意下拉列表里会同时出现 "Windows PowerShell"(这是 5.1)和 "PowerShell"(这才是 7),名字很像,别选混了。

winget 和 MSI 装的版本会自动向 Windows Terminal 注册配置文件,装完重开 Terminal 就能在列表里看到。

hudo 装的便携版不向系统注册配置文件,需要手动加一次:设置 → 添加新配置文件 → 新建空配置文件,"命令行"一栏填 pwsh.exe 的完整路径(例如 D:\hudo\tools\pwsh\pwsh.exe),名称填 "PowerShell 7",保存后再回到"启动"里把它设为默认。之后每个新标签页打开的就都是 PowerShell 7 了。

常见问题

安装 PowerShell 7 后需要卸载 Windows PowerShell 5.1 吗?

不需要,也卸不掉。5.1 是 Windows 的系统组件,没有常规卸载入口;它和 PowerShell 7 各占一个目录、各用一个可执行文件名,共存没有任何冲突。

老的 .ps1 脚本在 PowerShell 7 里还能跑吗?

绝大部分能直接跑。少数依赖 Windows 专属模块的脚本在 7 里需要走兼容层(Import-Module -UseWindowsPowerShell),个别行为有差异。实在不行,那个脚本继续用 powershell.exe 跑就是——两边本来就共存。

怎么确认我当前用的是 5.1 还是 7?

执行 $PSVersionTable.PSVersion,输出 5.1.x 就是 Windows PowerShell,7.x 就是 PowerShell 7。窗口标题也能区分:"Windows PowerShell" 是 5.1,"PowerShell" 是 7。

PowerShell 7 会自动更新吗?

看安装方式:winget 装的用 winget upgrade 手动升级;MSI 装的如果勾了 Microsoft Update 选项,会随系统更新;hudo 便携版不会自动更新,需要时重新执行 hudo install pwsh 获取新版(不锁版本时装的就是当时的最新版)。

相关阅读

基于 MIT 协议发布