整理在单个 PowerShell 脚本中运行的 Windows 右键菜单编辑工具的工作原理

PowerShellカテゴリを表すパンダのイラスト PowerShell

关于本文
本文是通过利用生成式 AI 的自动生成流程创建的。虽然内容是基于参考信息整理的,但作者并未在实际设备上进行确认。

验证状态:unverified(未在实机上确认)

Windows 资源管理器的右键菜单由注册表命令、COM 外壳扩展以及 Windows 11 打包应用等多种机制混合构成。“ROCI’s Context Menu Editor”是一款便携式工具,旨在不依赖外部库的情况下,仅通过单个 PowerShell 脚本和 WPF UI 对这些内容进行统一管理。

Windows 上下文菜单的三层结构与禁用机制

资源管理器的上下文菜单并非由单一的注册表项组成,而是由历史背景不同的三个信息源动态构建的。第一手资料显示,该工具将这些内容整合显示在同一列表中,并根据各自的特性执行“禁用(关闭)”处理。

类型 (Kind)存储位置禁用操作
CommandHKCU/HKLM\Software\Classes\<class>\shell\<verb>在 verb 下添加 LegacyDisable 值(不删除键本身)
Shell extension<class>\shellex\ContextMenuHandlers(7-Zip、PowerToys 等)将 CLSID 注册到 Shell Extensions\Blocked 中
Windows 11 menuwindows.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 处理程序。

确保安全性的备份与注册表操作实现方针

在涉及注册表编辑的工具中,各处都采用了旨在防止系统损坏的设计。

  1. 自动差异备份:在执行编辑或删除之前,目标键会作为 Backups\<timestamp>_<name>.reg 自动导出。可以通过状态栏调用撤销(Undo)来取消最近一次操作。
  2. 根据作用域的权限管理: HKCU(当前用户)的项目无需管理员权限即可修改。在修改面向所有用户的 HKLM 项目时,系统会提示以管理员身份重新启动该工具。
  3. 直接利用 .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日

  • 変更文章後半で見出しやリスト、コードブロックが途切れていたレイアウト崩れを修正しました。

文档信息

文章??
整理在单个 PowerShell 脚本中运行的 Windows 右键菜单编辑工具的工作原理
?布日期
更新日期
来源
https://papanda925.com/?p=17848&lang=zh

?可: ?于本站?有相??利的正文及原??表,除非?有?明,可依据 CC BY 4.0 使用。本文可能包含使用生成式AI?建或??的内容。若代??有?可声明,或?接的GitHub???定了?可,?代?以??可?准。引用内容、第三方?料、?片及商?不在本?可范?内。 使用政策

标题和URL已复制