Skip to content
AI SI Daily
English

搜索全站

↑↓ 选择 · Enter 打开 · Esc 关闭

● 亲手实测

告别 5.1:一行命令将右键「使用 PowerShell 运行」升级为 PowerShell 7

让右键「使用 PowerShell 运行」改用 PowerShell 7:一条免管理员命令,或自建 ProgID 完全掌控启动参数,附原理、回滚与避坑。

滴滴点到原发于 知乎 ↗

Windows 自带的右键菜单「使用 PowerShell 运行」,默认调起的依然是老旧的 Windows PowerShell 5.1。如果你已经安装了现代化的 PowerShell 7,完全可以让它全面接管 .ps1 脚本。本文提供两种无痛切换方案(强烈推荐第一种),并附带原理说明、一键回滚与避坑指南。

先搞懂原理(30 秒版)

Windows 右键菜单对脚本的处理行为,由三层注册表项串联决定:

.ps1 文件关联  →  ProgID(程序标识符)  →  Shell\<动词>\Command(实际执行的命令)
  • 系统默认: .ps1 指向 Microsoft.PowerShellScript.1。为防止双击误触发,它的默认打开(Open)是记事本,而右键运行(Run)则指向旧版 powershell.exe(5.1)。
  • 安装 PowerShell 7(MSI 版)后: 系统里通常会多出一个现成的 ProgID(如 Microsoft.PowerShellScript.7 或 PowerShell7.script),指向新版的 pwsh.exe。

因此,修改的本质只有一句话:在当前用户层重定向 .ps1 的 ProgID,或直接接管它的 Run / Open 动词命令。


方案一(推荐):直接切换文件关联(免管理员权限)

如果你安装的是 MSI 版 PowerShell 7,且系统已注册了对应的 ProgID,只需在任意 PowerShell 窗口(无需管理员权限)执行一条命令:

reg add "HKCU\Software\Classes\.ps1" /ve /d "Microsoft.PowerShellScript.7" /f

或者使用 PowerShell 原生命令:

Set-ItemProperty -Path "HKCU:\Software\Classes\.ps1" -Name "(default)" -Value "Microsoft.PowerShellScript.7"

为什么最推荐这个方案?

  • 安全免提权: 仅写入 HKCU(当前用户配置),不触碰系统全局注册表(HKLM),无需管理员权限。
  • 非破坏性覆盖: 不篡改系统原有的任何 ProgID,仅仅在用户层做了一层“优先级覆盖”,删掉该键值即可瞬间恢复出厂设置。
  • 即改即用: 立即生效,无需重启资源管理器(Explorer)或电脑。

💡 执行前先验证前提: 此方案要求系统中已存在 Microsoft.PowerShellScript.7 及其对应的执行命令。你可以先运行以下命令检查:

Test-Path "Registry::HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.7\Shell\*\Command"

如果返回 True,放心使用方案一;如果返回 False(例如你安装的是微软商店版、便携版,或安装时未勾选注册表关联),请直接采用方案二。


方案二(进阶):自建 ProgID,彻底掌控命令行

自己动手在用户层注册一个专属 ProgID,不仅能通杀所有安装版本(MSI / 商店版 / ZIP 便携版),还能自由定制启动参数(如隐藏版权信息、绕过执行策略等)。

第 1 步:确认 pwsh.exe 的真实路径

(Get-Command pwsh).Source
# MSI 版典型输出:C:\Program Files\PowerShell\7\pwsh.exe

第 2 步:注册专属 ProgID 并绑定右键菜单

将下方脚本中的 $pwsh 替换为你自己的实际路径,复制到任意 PowerShell 窗口中执行:

$pwsh = "C:\Program Files\PowerShell\7\pwsh.exe"

# 1. 注册右键「使用 PowerShell 7 运行」(Run 动词)
New-Item -Path "HKCU:\Software\Classes\MyPsScript7\Shell\Run\Command" -Force | Out-Null
Set-ItemProperty -Path "HKCU:\Software\Classes\MyPsScript7\Shell\Run" -Name "(default)" -Value "使用 PowerShell 7 运行"
Set-ItemProperty -Path "HKCU:\Software\Classes\MyPsScript7\Shell\Run\Command" `
  -Name "(default)" -Value "`"$pwsh`" -NoLogo -File `"%1`" %*"

# 2. 注册双击动作 (Open 动词):如果你希望双击直接运行脚本,可一并执行下面两行
New-Item -Path "HKCU:\Software\Classes\MyPsScript7\Shell\Open\Command" -Force | Out-Null
Set-ItemProperty -Path "HKCU:\Software\Classes\MyPsScript7\Shell\Open\Command" `
  -Name "(default)" -Value "`"$pwsh`" -NoLogo -File `"%1`" %*"

# 3. 将 .ps1 关联到自建的 ProgID
reg add "HKCU\Software\Classes\.ps1" /ve /d "MyPsScript7" /f

⚡ 常用进阶变体: 如果你的本地脚本经常被执行策略(ExecutionPolicy)拦截,或者脚本运行完窗口一闪而过看不清报错,可以把执行命令改成下面这样(加入 -ExecutionPolicy Bypass 和 -NoExit):

"C:\Program Files\PowerShell\7\pwsh.exe" -NoLogo -NoExit -ExecutionPolicy Bypass -File "%1" %*

⚠️ 安全提示: -ExecutionPolicy Bypass 会无视系统的脚本签名与执行限制。仅建议在个人开发环境中使用,切勿随意运行来源不明的 .ps1 脚本。


效果验证

  1. 随便建一个测试脚本(写入 $PSVersionTable.PSVersion; Pause),右键选择运行。
  2. 观察弹出的终端标题栏或输出的版本号,主版本(Major)显示为 7 即代表大功告成。

一键回滚

哪天想恢复系统默认(回到 PowerShell 5.1),只需删掉我们在用户层添加的覆盖项,系统默认配置会立刻重新生效:

# 恢复 .ps1 默认关联
Remove-Item -Path "HKCU:\Software\Classes\.ps1" -Recurse -Force

# (可选)如果你用了方案二,可以顺手清理自建的 ProgID
Remove-Item -Path "HKCU:\Software\Classes\MyPsScript7" -Recurse -Force -ErrorAction SilentlyContinue

避坑指南

  • 避开商店版(MSIX)的应用执行别名: 微软商店版默认生成的路径 C:\Users\<用户名>\AppData\Local\Microsoft\WindowsApps\pwsh.exe 是一个虚拟重解析点,在部分右键调用场景下可能失效。建议优先安装官方 MSI 包,并在命令中写死稳定的物理路径 C:\Program Files\PowerShell\7\pwsh.exe。
  • 警惕双击误执行: Windows 默认将 .ps1 的双击动作设为“用记事本打开”,是为了防止双击误运行危险脚本。如果你在方案二中把 Open 动词也改成了 pwsh.exe,以后双击 .ps1 就会直接执行脚本——很爽快,但请务必心里有数。
  • 图形界面(GUI)修改的局限性: 右键 .ps1 →「打开方式」→ 选中 pwsh.exe 并勾选“始终”,虽然不用敲命令,但这实际上是通过 UserChoice 哈希锁死了 Open(双击)动作,不仅无法定制启动参数(如 -File),有时还会导致右键菜单项丢失或报错,控制力远不如注册表方案。
  • Windows 11 右键菜单折叠问题: Win11 的新版右键菜单默认会把传统 Shell 扩展折叠进二级菜单。右键后没看到选项不用慌,点击底部的「显示更多选项」(或按住 Shift + 右键)即可看到。

本文原发于知乎,作者「滴滴点到」,经作者授权整理收录于 AI SI Daily。

同类推荐