关于本文
本文是通过利用生成式 AI 的自动生成流程创建的。虽然内容是基于参考信息整理的,但作者并未在实际设备上进行确认。
验证状态:unverified(未在实机上确认)
Windows 资源管理器的右键菜单由注册表命令、COM 外壳扩展以及 Windows 11 打包应用等多种机制混合构成。“ROCI’s Context Menu Editor”是一款便携式工具,旨在不依赖外部库的情况下,仅通过单个 PowerShell 脚本和 WPF UI 对这些内容进行统一管理。
Windows 上下文菜单的三层结构与禁用机制
资源管理器的上下文菜单并非由单一的注册表项组成,而是由历史背景不同的三个信息源动态构建的。第一手资料显示,该工具将这些内容整合显示在同一列表中,并根据各自的特性执行“禁用(关闭)”处理。
| 类型 (Kind) | 存储位置 | 禁用操作 |
|---|---|---|
| Command | HKCU/HKLM\Software\Classes\<class>\shell\<verb> | 在 verb 下添加 LegacyDisable 值(不删除键本身) |
| Shell extension | <class>\shellex\ContextMenuHandlers(7-Zip、PowerToys 等) | 将 CLSID 注册到 Shell Extensions\Blocked 中 |
| Windows 11 menu | windows.fileExplorerContextMenus 声明的打包应用 | 将 CLSID 设为 Shell Extensions\Blocked 注册 |
Command 格式的项不是删除键,而是通过设置 LegacyDisable 来隐藏,从而不丢失原始设置。另一方面,加载 DLL 的外壳扩展以及 Windows 11 特有的打包应用菜单,则是通过将各扩展的 CLSID 添加到每个用户的阻止列表中来阻止加载。
flowchart TD
A[右クリックメニュー項目] --> B{項目の種類}
B -->|Command| C[レジストリのverbキー]
B -->|Shell extension| D[ContextMenuHandlersのCLSID]
B -->|Windows 11 menu| E[パッケージアプリのCLSID]
C --> F[無効化: LegacyDisable値を付与]
D --> G[無効化: Shell Extensions/Blockedに追加]
E --> G
此外,侧边栏支持按目标显示位置(文件, 文件夹, 文件夹背景, 桌面, 驱动器, 单个扩展名)进行过滤。在提取单个扩展名时,SystemFileAssociations\.ext、扩展名的 ProgID、PerceivedType 以及默认应用的 ProgID 相结合,以确定菜单结构。
ROCI’s Context Menu Editor 的主要功能与操作体系
该工具不仅限于简单的开关切换,还涵盖了项目编辑和损坏项目清理等实用的维护功能。
- 命令的添加与编辑: 可以指定名称、执行命令行(表示目标路径的
%1或表示文件夹的%V)、图标、显示位置、仅在按下 Shift 键时显示的设置、UAC 盾牌图标的有无等。 - 子菜单分组:
SubCommands=""采用嵌套的shell键静态格式,菜单的层级化以及层级间的移动操作在注册表编辑层面即可完成。 - 检测损坏条目(Broken entries): 列出引用程序或 DLL 不存在的项目以及未注册的处理程序 CLSID,并可进行批量删除(Remove all)。为防止误报,仅对绝对路径进行验证,
wt.exe等单独的命令名、UNC 路径以及 Store 应用文件夹将被排除在外。 - 新建菜单(New menu)的管理:
ShellNew键下方的扩展名。禁用时将键重命名为_ShellNew以脱离 Windows 的识别,启用时则进行恢复。 - 批量操作与测试:可以选择多行并批量执行切换或删除,此外,从编辑界面中的“Test”按钮可以针对指定的档案或文件夹,在展开
%1或%V的状态下进行测试运行。
发送到(Send to)集成与 Windows 11 打包应用支持
除了管理“发送到(Send to)”文件夹中的快捷方式之外,还具备将常规右键菜单项转换为 Send To 项目的功用。
常规命令的转换
在参数末尾传递文件路径的命令(例:app.exe -x "%1")将作为去除了参数末尾的快捷方式注册到 Send To 中。这是因为 Windows 的 Send To 功能本身会自动在末尾附加所选文件的路径。对于参数位置不在末尾的命令,会显示无法转换的提示。
Windows 11 专属项目的 COM 桥接
Windows 11 格式的上下文菜单项没有命令行,而是直接从资源管理器中调用 COM 处理程序。为了从 Send To 中调用它,该工具在首次使用时会从内嵌的 C# 代码中编译并部署一个小型可执行文件(位于 CmeSendTo.exe,存放在 %LOCALAPPDATA%\ContextMenuEditor 下方)。快捷方式通过此桥接来调用原有的 COM 处理程序。
确保安全性的备份与注册表操作实现方针
在涉及注册表编辑的工具中,各处都采用了旨在防止系统损坏的设计。
- 自动差异备份:在执行编辑或删除之前,目标键会作为
Backups\<timestamp>_<name>.reg自动导出。可以通过状态栏调用撤销(Undo)来取消最近一次操作。 - 根据作用域的权限管理:
HKCU(当前用户)的项目无需管理员权限即可修改。在修改面向所有用户的HKLM项目时,系统会提示以管理员身份重新启动该工具。 - 直接利用 .NET 注册表 API:PowerShell 标准注册表提供程序(如
Get-Item和Set-ItemProperty等)存在将路径中的*\shell等字符误解为通配符的问题。为了避免这种情况,所有操作都直接使用了 .NET 的Microsoft.Win32.Registry架构。
单文件编译结构与模块化设计
虽然分发形式是一个单一的脚本,但为了保持可维护性,源代码库中按功能将文件进行了拆分:
scripts/header.ps1:程序集加载、本机类型定义、常量定义scripts/start.ps1:参数处理、初始化逻辑functions/core/*.ps1:注册表扫描、发送到(Send To)处理、Tweaks 引擎等与 UI 无关的逻辑functions/ui/*.ps1:WPF 对话框、视图、撤销管理、命令编辑界面scripts/main.ps1:窗口构建与事件处理程序连接xaml/*.xaml:UI 界面定义native/*.cs:Win32 互操作代码以及发送到(Send To)桥接(C#)config/*.json:Tweaks 定义(注册表值、检测脚本、还原处理等)
这些组件在由 Compile.ps1 脚本进行验证的同时被合并为一个单一脚本。输出时采用无 BOM UTF-8 格式(以保持 PowerShell 5.1 和 7 的兼容性,并防止通过 irm | iex 运行时出错)。
利用 -LibraryOnly 从脚本中调用
为了允许脚本仅使用后端处理而不启动用户界面,提供了 -LibraryOnly 开关。通过这种方式,可以从 CI 或终端脚本中以对象形式获取扫描结果。
调用示例如下:
# 保存名: inspect_menu.ps1
# 実行前提: ContextMenuEditor.ps1 と同じディレクトリで実行すること
. .\ContextMenuEditor.ps1 -LibraryOnly
# スキャンを実行
$App = Invoke-Scan
# Windows標準機能以外の項目を抽出して表示
$App.Items | Where-Object { -not $_.IsBuiltIn } | Format-Table Kind, Hive, Name, LocLabel, Enabled
通过此命令将输出包含 Kind、Hive、Name、LocLabel、Enabled 等属性的对象组。
使用时的注意事项与边界条件
在实际应用中,必须了解由工具设计理念导致的以下限制和运行规范。
- 重启资源管理器: 外壳扩展和部分注册表更改无法立即生效,需要重启资源管理器进程(可以从工具的状态栏中重启)。
- 损坏条目的判定边界: 不存在路径的检测仅针对绝对路径。依赖环境变量 PATH 的可执行文件名和应用商店应用的路径将被跳过验证,以防止误判。
- 新建菜单的 ProgID 限制: 在“新建”菜单中添加扩展名时,如果不存在与目标扩展机关联的 ProgID,注册将被拒绝。
- 导出/导入的应用范围: 设置导出(输出为 .reg)仅针对用户专属(
HKCU)的设置,面向所有用户(HKLM)的程序专属条目将被排除在外。
总结
ROCI 的上下文菜单编辑器是一个便携式实用程序,仅使用 PowerShell 和 WPF 即可整理日益复杂的 Windows 右键菜单结构。
在实际环境中部署之前,需要确认以下要点:
- 修改目标是
HKCU(当前用户)还是HKLM(整个计算机),这决定了是否需要管理员权限 - 采用的不是简单删除,而是使用
LegacyDisable或Shell Extensions\Blocked等进行非破坏性控制 - 单独运行脚本时的备份将保存在与可执行文件同级目录的
Backups文件夹中 - 需要确认自动生成的
CmeSendTo.exe等桥接功能是否会与环境的安全策略冲突
参考信息
- A Windows context menu editor in one PowerShell file: https://github.com/RoeeIlouz/ROCIsContextMenu-Editor
- A Windows context menu editor in one PowerShell file (DEV Community): https://dev.to/rocisapps/a-windows-context-menu-editor-in-one-powershell-file-2mc
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年10月6日
- 変更文章後半で見出しやリスト、コードブロックが途切れていたレイアウト崩れを修正しました。

