99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
"""
|
||
一次性脚本:将 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。")
|