Windows 右键菜单管理工具

功能描述:
1. 添加:打开 Cmd
2. 添加:打开 Cmd(管理员)
3. 添加:打开 PowerShell
4. 添加:打开 PowerShell(管理员)
5. 移除:打开 Cmd
6. 移除:打开 Cmd(管理员)
7. 移除:打开 PowerShell
8. 移除:打开 PowerShell(管理员)
9. 一键添加所有功能
10. 一键移除所有功能
11. 刷新状态
12. 退出脚本
如果执行了添加只有在右击文件夹空白处时, 才在右键菜单中显示对应的功能, 如果执行了移除, 则右键菜单中不显示对应的功能.
如果执行了添加, 右击选择打开对应的管理员后, 弹出的管理窗口对应路径也是这个文件夹的路径.

Snipaste

 

代码实现:

# -*- coding: utf-8 -*-
"""
Windows 文件夹空白处右键菜单:命令行 / PowerShell(普通与管理员)
需当前用户可写 HKCU;管理员项会触发 UAC。
"""

from __future__ import annotations

import os
import sys
import winreg
from typing import Callable, Dict, Tuple

# ---------------------------------------------------------------------------
# 注册表:仅在此处集中定义,便于查看与修改
# HKCU 下会覆盖当前用户的类注册,无需管理员权限即可写入(管理员“启动”仍会 UAC)
# ---------------------------------------------------------------------------
REG_HIVE = winreg.HKEY_CURRENT_USER
# 相对 HKEY_CURRENT_USER 的路径(不含根键名)
REG_SHELL_BASE = r"Software\Classes\Directory\Background\shell"

# 每项:(注册表子键名, 菜单显示文字, 执行的命令字符串, 是否显示 UAC 盾牌图标)
# %V:资源管理器在「文件夹背景」右键中替换为当前文件夹路径
_CMD_ADMIN = (
    'powershell.exe -NoProfile -WindowStyle Hidden -Command '
    '"Start-Process cmd.exe -Verb RunAs -ArgumentList \'/k pushd \\"%V\\"\'"'
)
_PS_ADMIN = (
    'powershell.exe -NoProfile -WindowStyle Hidden -Command '
    '"Start-Process powershell.exe -Verb RunAs -ArgumentList \'-NoExit\',\'-NoProfile\',\'-Command\',\'Set-Location -LiteralPath \'\'%V\'\'\'"'
)


MENU_DEFS: Dict[str, Tuple[str, str, str, bool]] = {
    "OpenCmdHere": (
        '打开 Cmd',
        "cmd.exe",
        r'cmd.exe /s /k pushd "%V"',
        False,
    ),
    "OpenCmdHereAdmin": (
        '打开 Cmd(管理员)',
        "cmd.exe",
        _CMD_ADMIN,
        True,
    ),
    "OpenPowerShellHere": (
        '打开 PowerShell',
        "powershell.exe",
        "powershell.exe -NoProfile -NoExit -Command \"Set-Location -LiteralPath '%V'\"",
        False,
    ),
    "OpenPowerShellHereAdmin": (
        '打开 PowerShell(管理员)',
        "powershell.exe",
        _PS_ADMIN,
        True,
    ),
}


def _full_shell_path(subkey_name: str) -> str:
    return REG_SHELL_BASE + "\\" + subkey_name


def _ensure_utf8_stdio() -> None:
    try:
        sys.stdout.reconfigure(encoding="utf-8")  # type: ignore[attr-defined]
        sys.stdin.reconfigure(encoding="utf-8")  # type: ignore[attr-defined]
    except Exception:
        pass


def key_exists(subpath: str) -> bool:
    try:
        winreg.OpenKey(REG_HIVE, subpath, 0, winreg.KEY_READ)
        return True
    except OSError:
        return False


def add_entry(name: str) -> None:
    if name not in MENU_DEFS:
        raise KeyError(name)
    label, icon_exe, command, show_uac = MENU_DEFS[name]
    shell_path = _full_shell_path(name)
    cmd_path = shell_path + r"\command"

    with winreg.CreateKey(REG_HIVE, shell_path) as sk:
        winreg.SetValueEx(sk, "", 0, winreg.REG_SZ, label)
        winreg.SetValueEx(sk, "Icon", 0, winreg.REG_SZ, icon_exe)
        if show_uac:
            winreg.SetValueEx(sk, "HasLUAShield", 0, winreg.REG_SZ, "")
    with winreg.CreateKey(REG_HIVE, cmd_path) as ck:
        winreg.SetValueEx(ck, "", 0, winreg.REG_SZ, command)


def remove_entry(name: str) -> None:
    shell_path = _full_shell_path(name)
    cmd_path = shell_path + r"\command"
    # 先删子键
    try:
        winreg.DeleteKey(REG_HIVE, cmd_path)
    except OSError:
        pass
    try:
        winreg.DeleteKey(REG_HIVE, shell_path)
    except OSError:
        pass


def status_line(name: str) -> str:
    return "已安装" if key_exists(_full_shell_path(name)) else "未安装"


def print_banner() -> None:
    print("========================================================")
    print("          Windows 右键菜单管理工具")
    print("========================================================")
    print()
    print('  脚本功能:管理 "在此处打开命令行/PowerShell" 菜单')
    print("  注意:管理员模式将触发 UAC 提示")
    print()
    print("--------------------------------------------------------")
    print('  [1]  添加:打开 Cmd')
    print('  [2]  添加:打开 Cmd(管理员)')
    print('  [3]  添加:打开 PowerShell')
    print('  [4]  添加:打开 PowerShell(管理员)')
    print("--------------------------------------------------------")
    print('  [5]  移除:打开 Cmd')
    print('  [6]  移除:打开 Cmd(管理员)')
    print('  [7]  移除:打开 PowerShell')
    print('  [8]  移除:打开 PowerShell(管理员)')
    print("--------------------------------------------------------")
    print("  [9]  一键添加所有功能")
    print("  [10] 一键移除所有功能")
    print("  [11] 刷新状态")
    print("--------------------------------------------------------")
    print("  [0]  退出脚本")
    print("========================================================")
    print()


def print_status() -> None:
    print("状态:")
    print(f"CMD:\t\t{status_line('OpenCmdHere')}")
    print(f"CMD(管理员):\t{status_line('OpenCmdHereAdmin')}")
    print(f"PowerShell:\t{status_line('OpenPowerShellHere')}")
    print(f"PowerShell(管理员):\t{status_line('OpenPowerShellHereAdmin')}")
    print()
    print(f"注册表根: HKEY_CURRENT_USER\\{REG_SHELL_BASE}")
    print()


def main() -> None:
    _ensure_utf8_stdio()
    order = [
        "OpenCmdHere",
        "OpenCmdHereAdmin",
        "OpenPowerShellHere",
        "OpenPowerShellHereAdmin",
    ]
    actions: Dict[str, Callable[[], None]] = {
        "1": lambda: add_entry("OpenCmdHere"),
        "2": lambda: add_entry("OpenCmdHereAdmin"),
        "3": lambda: add_entry("OpenPowerShellHere"),
        "4": lambda: add_entry("OpenPowerShellHereAdmin"),
        "5": lambda: remove_entry("OpenCmdHere"),
        "6": lambda: remove_entry("OpenCmdHereAdmin"),
        "7": lambda: remove_entry("OpenPowerShellHere"),
        "8": lambda: remove_entry("OpenPowerShellHereAdmin"),
        "9": lambda: [add_entry(n) for n in order],
        "10": lambda: [remove_entry(n) for n in order],
        "11": lambda: None,
    }

    while True:
        print_banner()
        print_status()
        choice = input("请输入选项 (0-11):").strip()
        if choice == "0":
            print("已退出。")
            break
        if choice in actions:
            try:
                actions[choice]()
                if choice != "11":
                    print("操作完成。若资源管理器未更新,可关闭已打开的文件夹窗口再试。")
            except OSError as e:
                print(f"操作失败: {e}")
            input("按 Enter 继续...")
        else:
            print("无效选项,请重新输入。")
            input("按 Enter 继续...")
        print()


if __name__ == "__main__":
    if os.name != "nt":
        print("此脚本仅适用于 Windows。")
        sys.exit(1)
    main()

运行:

将上面文件保存为 manage_folder_background_menu.py
如果电脑中已经安装了 py. 通过 cmd 运行代码

python C:\Users\Administrator\Desktop\manage_folder_background_menu.py

 

posted on 2026-03-22 14:39  书源  阅读(4)  评论(0)    收藏  举报

导航