Files
Neo-ZQYY/scripts/ops/set_default_pwsh7.py

99 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
一次性脚本:将 Windows 系统级默认 shell 切换为 PowerShell 7
1. Windows Terminal 默认 profile → pwsh.exe
2. OpenSSH DefaultShell 注册表 → pwsh.exe
3. 系统 ComSpec 环境变量不动(保持 cmd.exe 兼容)
"""
import json
import os
import subprocess
import winreg
PWSH7 = r"C:\Program Files\PowerShell\7\pwsh.exe"
# ── 1. Windows Terminal settings.json ──
wt_settings = os.path.join(
os.environ["LOCALAPPDATA"],
"Packages",
"Microsoft.WindowsTerminal_8wekyb3d8bbwe",
"LocalState",
"settings.json",
)
wt_preview = os.path.join(
os.environ["LOCALAPPDATA"],
"Packages",
"Microsoft.WindowsTerminalPreview_8wekyb3d8bbwe",
"LocalState",
"settings.json",
)
# Windows Terminal 的 PowerShell 7 profile GUID官方固定值
PWSH7_GUID = "{574e775e-4f2a-5b96-ac1e-a2962a402336}"
for path in [wt_settings, wt_preview]:
if os.path.isfile(path):
with open(path, "r", encoding="utf-8") as f:
content = f.read()
# 去掉 JSON 注释行Windows Terminal 允许 // 注释)
lines = []
for line in content.splitlines():
stripped = line.lstrip()
if stripped.startswith("//"):
continue
lines.append(line)
clean = "\n".join(lines)
try:
cfg = json.loads(clean)
except json.JSONDecodeError:
print(f"跳过JSON 解析失败): {path}")
continue
cfg["defaultProfile"] = PWSH7_GUID
with open(path, "w", encoding="utf-8") as f:
json.dump(cfg, f, indent=4, ensure_ascii=False)
print(f"已更新 Windows Terminal defaultProfile: {path}")
else:
print(f"未找到 Windows Terminal 配置: {path}")
# ── 2. OpenSSH DefaultShell 注册表 ──
try:
key = winreg.CreateKeyEx(
winreg.HKEY_LOCAL_MACHINE,
r"SOFTWARE\OpenSSH",
0,
winreg.KEY_SET_VALUE,
)
winreg.SetValueEx(key, "DefaultShell", 0, winreg.REG_SZ, PWSH7)
winreg.CloseKey(key)
print(f"已设置 OpenSSH DefaultShell → {PWSH7}")
except PermissionError:
print("OpenSSH 注册表写入需要管理员权限,跳过(可手动以管理员运行)")
except Exception as e:
print(f"OpenSSH 注册表写入失败: {e}")
# ── 3. 将 pwsh.exe 所在目录加到 PATH 最前面(如果不在的话)──
pwsh_dir = os.path.dirname(PWSH7)
current_path = os.environ.get("PATH", "")
if pwsh_dir.lower() not in current_path.lower():
# 写入用户级 PATH
try:
key = winreg.OpenKeyEx(
winreg.HKEY_CURRENT_USER,
r"Environment",
0,
winreg.KEY_READ | winreg.KEY_SET_VALUE,
)
user_path, _ = winreg.QueryValueEx(key, "Path")
if pwsh_dir.lower() not in user_path.lower():
new_path = pwsh_dir + ";" + user_path
winreg.SetValueEx(key, "Path", 0, winreg.REG_EXPAND_SZ, new_path)
print(f"已将 {pwsh_dir} 添加到用户 PATH 最前面")
else:
print(f"{pwsh_dir} 已在用户 PATH 中")
winreg.CloseKey(key)
except Exception as e:
print(f"PATH 更新失败: {e}")
else:
print(f"{pwsh_dir} 已在 PATH 中")
print("\n完成。新开的终端窗口将默认使用 PowerShell 7。")