乐于分享
好东西不私藏

set7default.ps1 脚本说明

set7default.ps1 脚本说明

set7default.ps1 脚本说明


脚本概述

文件名set7default.ps1

用途: 将 PowerShell 7 (pwsh) 设置为默认终端 Shell

作者: 大柚子

适用系统: Windows 10 / Windows 11 (需要管理员权限)

依赖:

  • PowerShell 7 (pwsh.exe)

使用方法

基本用法

# 在 PowerShell 7 中以管理员身份运行脚本.\set7default.ps1

权限要求

必须以管理员身份运行。脚本第一行 #Requires -RunAsAdministrator 会强制检查权限,如果权限不足会自动提示。

操作流程

  1. 以管理员身份启动 PowerShell 7
  2. 切换到脚本所在目录
  3. 运行脚本 (.\set7default.ps1)
  4. 脚本自动完成以下操作:
    • 检查 PowerShell 7 是否已安装
    • 设置 Windows Terminal 为默认终端应用
    • 设置 Windows Terminal 默认配置文件为 PowerShell 7
    • 更新右键上下文菜单,使其直接打开 PowerShell 7
  5. 重新打开终端窗口,更改生效

功能说明

主要功能

这个脚本用于一键设置 PowerShell 7 为默认终端,包括:

  1. 将 Windows Terminal 设置为系统默认终端应用
  2. 将 Windows Terminal 的默认配置文件设置为 PowerShell 7
  3. 更新右键菜单,使其在打开 Windows Terminal 时直接使用 PowerShell 7

执行流程

1. 检查 PowerShell 7 是否已安装

  • 使用 Get-Command pwsh 检查 pwsh.exe 是否在 PATH 中
  • 如果未找到,输出警告信息并退出 (返回退出码 1)

2. 设置 Windows Terminal 为默认终端应用

  • 修改注册表 HKCU:\Console\%%Startup
  • 设置 DelegationTerminal 为 Windows Terminal 的 GUID
  • 设置 DelegationConsole 为 Windows Terminal ConPTY 主机的 GUID

3. 设置 Windows Terminal 默认配置文件为 PowerShell 7

  • 读取 Windows Terminal 的配置文件 settings.json
  • 按优先级查找 PowerShell 7 配置文件:
    1. commandline 包含 pwsh.exe (手动添加的配置)
    2. source 包含 PowerShellCore (自动发现的配置)
    3. name 等于 "PowerShell" (回退方案)
  • 将找到的配置文件的 GUID 设置为 defaultProfile
  • 将修改后的配置写回 settings.json (使用 UTF-8 without BOM 编码)

4. 更新右键上下文菜单

  • 修改注册表,更新右键菜单中 Windows Terminal 的启动参数
  • 使用 GUID 而不是名称来指定配置文件 (避免配置文件重命名导致的问题)
  • 处理两个位置的右键菜单:
    • HKCR:\Directory\shell\wt\command (在文件夹上右键)
    • HKCR:\Directory\Background\shell\wt\command (在文件夹空白处右键)

注册表修改详解

1. 设置默认终端应用

注册表路径HKCU:\Console\%%Startup

值名称
类型
说明
DelegationTerminal
REG_SZ
{E12CFF52-A866-4C77-9A90-F570A7AA2C6B}
Windows Terminal 的 GUID
DelegationConsole
REG_SZ
{2EACA947-7F5F-4CFA-BA87-8F7FBEEFBE69}
Windows Terminal ConPTY 主机的 GUID

2. Windows Terminal 配置文件

文件路径%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

修改的字段defaultProfile

查找 PowerShell 7 配置文件的优先级:

  1. commandline 包含 pwsh.exe → 手动添加的配置
  2. source 包含 PowerShellCore → 自动发现的配置
  3. name 等于 "PowerShell" → 回退方案

3. 右键上下文菜单

注册表路径
说明
HKCR:\Directory\shell\wt\command
在文件夹上右键时显示的 "在 Windows Terminal 中打开"
HKCR:\Directory\Background\shell\wt\command
在文件夹空白处右键时显示的 "在 Windows Terminal 中打开"

修改内容: 在命令末尾添加 -p "<PowerShell 7 的 GUID>" 参数,使 Windows Terminal 使用 PowerShell 7 打开。


输出示例

示例 1: 成功执行

PS C:\ps1> .\set7default.ps1

输出:

[OK] Found pwsh: C:\Program Files\PowerShell\7\pwsh.exe[OK] Default terminal app set to Windows Terminal[OK] Windows Terminal defaultProfile set to PowerShell 7 ({...})[OK] Updated context menu: HKCR:\Directory\shell\wt\command[OK] Updated context menu: HKCR:\Directory\Background\shell\wt\commandDone! Please reopen terminal windows for changes to take effect.

示例 2: PowerShell 7 未安装

PS C:\ps1> .\set7default.ps1

输出:

WARNING: pwsh.exe not found. Please install PowerShell 7 first.

示例 3: Windows Terminal 未安装

PS C:\ps1> .\set7default.ps1

输出:

[OK] Found pwsh: C:\Program Files\PowerShell\7\pwsh.exe[OK] Default terminal app set to Windows TerminalWARNING: Windows Terminal settings.json not found. Please install Windows Terminal.

示例 4: 已经设置过

PS C:\ps1> .\set7default.ps1

输出:

[OK] Found pwsh: C:\Program Files\PowerShell\7\pwsh.exe[OK] Default terminal app set to Windows Terminal[SKIP] Windows Terminal defaultProfile is already PowerShell 7 ({...})[SKIP] Context menu already has correct args: HKCR:\Directory\shell\wt\command[SKIP] Context menu already has correct args: HKCR:\Directory\Background\shell\wt\commandDone! Please reopen terminal windows for changes to take effect.

技术实现

Cmdlet 使用

Cmdlet
用途
Get-Command
检查 pwsh 命令是否存在
Test-Path
验证注册表路径和文件是否存在
New-Item
创建注册表项
Set-ItemProperty
设置注册表值
Get-ItemProperty
读取注册表值
Get-Content
读取 Windows Terminal 配置文件
ConvertFrom-Json
将 JSON 字符串转换为 PowerShell 对象
ConvertTo-Json
将 PowerShell 对象转换为 JSON 字符串
Set-Content
将修改后的配置写回文件

参数说明

参数
说明
-Raw
 (Get-Content)
将文件内容作为单个字符串读取
-Depth 20
 (ConvertTo-Json)
指定 JSON 转换的深度
-Encoding utf8NoBOM
 (Set-Content)
使用不带 BOM 的 UTF-8 编码写入文件
-Force
 (Set-ItemProperty)
强制设置注册表值 (如果不存在则创建)
-First 1
 (Select-Object)
只选择第一个匹配项

应用场景

1. 新系统快速配置

在新安装的 Windows 系统上,运行此脚本可以快速将 PowerShell 7 设置为默认终端,提升命令行体验。

2. 批量部署

在需要批量配置多台计算机的环境中,可以将此脚本与其他配置脚本结合使用。

3. 修复终端配置

如果 Windows Terminal 的默认配置文件被意外修改,可以运行此脚本修复。


注意事项

1. 需要管理员权限

脚本会修改 HKEY_CLASSES_ROOT (HKCR) 注册表项,这需要管理员权限。

2. 需要 PowerShell 7 和 Windows Terminal

脚本依赖以下程序:

  • PowerShell 7 (pwsh.exe): 如未安装,请先安装
  • Windows Terminal (wt.exe): 如未安装,请从 Microsoft Store 安装

3. 修改后立即生效?

  • 默认终端应用: 需要重新打开"设置"应用或重启资源管理器
  • Windows Terminal 默认配置文件: 需要重新打开 Windows Terminal
  • 右键菜单: 需要重新打开文件资源管理器 (或重启系统)

4. UTF-8 without BOM 编码

脚本使用 utf8NoBOM 编码写入 Windows Terminal 的 settings.json 文件,避免 Windows Terminal 解析错误。

5. GUID 的使用

脚本使用 PowerShell 7 配置文件的 GUID 来指定默认配置文件,而不是使用配置文件名称。这样可以避免因配置文件重命名导致的问题。


扩展与自定义

修改为使用其他终端

如果希望使用其他终端 (如 Windows Console Host),可以修改脚本第 37-38 行:

# 原代码 (使用 Windows Terminal)Set-ItemProperty -Path $startupKey -Name 'DelegationTerminal' -Value '{E12CFF52-A866-4C77-9A90-F570A7AA2C6B}' -Force# 修改为使用 Windows Console HostSet-ItemProperty -Path $startupKey -Name 'DelegationTerminal' -Value '{...}' -Force

添加其他配置文件的支持

如果希望将其他配置文件 (如 Git Bash, WSL 等) 设置为默认,可以修改脚本第 56-62 行的查找逻辑:

# 添加对 Git Bash 的支持$pwshProfile = $json.profiles.list | Where-Object { $_.name -match 'Git Bash' } | Select-Object -First 1

静默运行 (不输出信息)

可以修改脚本,添加 -Quiet 参数来实现静默运行:

param(    [switch]$Quiet)# 然后将所有 Write-Host 改为:if (-not $Quiet) {    Write-Host "..."}

常见问题 (FAQ)

Q1: 运行脚本后,右键菜单没有变化?

A: 可能是因为:

  1. 文件资源管理器缓存了旧的注册表值,尝试重启资源管理器:
    Stop-Process -Name explorerStart-Process explorer
  2. 注册表路径不正确,检查 HKCR:\Directory\shell\wt\command 是否存在

Q2: 如何恢复为使用 Windows PowerShell 5.1?

A: 可以手动修改 Windows Terminal 的 settings.json 文件,将 defaultProfile 修改为 Windows PowerShell 5.1 的 GUID。

或者,删除 settings.json 文件 (Windows Terminal 会自动重置为默认配置)。

Q3: 脚本可以在 Windows 10 上运行吗?

A: 可以。脚本同时支持 Windows 10 和 Windows 11。

但需要确保:

  1. 已安装 Windows Terminal
  2. 已安装 PowerShell 7

Q4: 如何查看当前默认的终端应用?

A: 在 PowerShell 中运行:

Get-ItemProperty -Path 'HKCU:\Console\%%Startup'

Q5: 脚本会修改系统级别的设置吗?

A: 脚本只修改当前用户的设置 (HKCU 和当前用户的 Windows Terminal 配置),不会影响其他用户。


技术支持

如遇到问题,请检查:

  1. 是否以管理员身份运行 PowerShell
  2. 是否已安装 PowerShell 7 (Get-Command pwsh)
  3. 是否已安装 Windows Terminal (Get-Command wt)
  4. PowerShell 版本是否支持 ($PSVersionTable.PSVersion)

相关资源

  • Windows Terminal 文档
  • PowerShell 7 文档
  • Windows Terminal settings.json 文档
  • PowerShell #Requires 语句文档

安全注意事项

  1. 权限管理: 脚本需要管理员权限,确保只在可信环境运行
  2. 注册表修改: 脚本会修改注册表,建议先在测试环境中运行
  3. 备份: 在运行脚本前,可以备份 Windows Terminal 的 settings.json 文件