用 PowerShell 为 Windows 文件和文件夹添加复制正斜杠完整路径菜单
Windows 可以通过注册表扩展资源管理器右键菜单。本例给文件和文件夹加入“复制完整路径(带文件名)”,复制结果统一使用正斜杠:
C:/Users/example/Desktop/demo.txt实现只修改当前用户配置,不需要管理员权限。安装脚本会创建一个本地辅助脚本,再为文件和文件夹分别注册菜单命令。
目标行为与运行条件
目标包含四项可验证行为:
- 文件右键菜单显示“复制完整路径(带文件名)”。
- 文件夹右键菜单显示同一个命令。
- 菜单执行期间不显示 PowerShell 控制台窗口。
- 剪贴板使用
/作为路径分隔符,并保留中文、空格和&等字符。
运行环境为 Windows 10 或 Windows 11,使用系统自带的 Windows PowerShell。Windows 11 可能把自定义菜单放在“显示更多选项”中。
文件与文件夹的注册表入口
资源管理器为文件和文件夹使用不同的类注册入口。只写文件入口时,文件夹不会显示菜单。
| 对象 | 当前用户注册表路径 |
|---|---|
| 所有文件 | HKCU\Software\Classes\*\shell\CopyFullPathWithFilename |
| 所有文件夹 | HKCU\Software\Classes\Directory\shell\CopyFullPathWithFilename |
每个菜单键保存显示名称和图标,子键 command 的默认值保存执行命令。%1 由资源管理器替换成当前选中的完整路径。
脚本使用 Microsoft.Win32.Registry 写入默认值。这个 API 可以直接处理空名称的注册表默认值,也避开了 PowerShell 注册表驱动对默认值的差异。
-Command 参数解析故障
最初的命令尝试在 -Command 后声明参数:
powershell.exe -Command "param([string]$p) Set-Clipboard -Value $p" "%1"从资源管理器启动时,-Command 后续内容可能继续进入命令文本解析。文件路径没有稳定绑定到 param()。路径含 & 时,PowerShell 会把它识别成调用运算符并产生解析错误;用户只能看到短暂黑框,剪贴板没有变化。
解决方法是把复制逻辑放进独立 .ps1 文件,再通过 -File 传递位置参数:
powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "辅助脚本路径" "%1"-File 会把最后一个参数交给脚本的 $Path。路径中的空格、中文和 & 继续保持为一个参数。-WindowStyle Hidden 隐藏控制台窗口,-ExecutionPolicy Bypass 只作用于本次辅助进程。
-File 辅助脚本与正斜杠转换
辅助脚本安装到当前用户的本地应用数据目录:
%LOCALAPPDATA%/CopyFullPathWithFilename/copy-full-path.ps1脚本只接收一个路径,替换分隔符后写入剪贴板:
param(
[Parameter(Mandatory = $true, Position = 0)]
[string]$Path
)
Set-Clipboard -Value $Path.Replace('\', '/')替换只影响剪贴板文本,不会修改磁盘上的文件名或目录结构。Windows API 仍把原始反斜杠路径传给脚本。
一键安装与端到端验证
附件中的安装脚本是自包含版本。它创建辅助脚本,并重复写入两类菜单键。重复运行会更新同一组键,不会产生重复菜单。
在附件所在目录执行安装:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\install-copy-full-path-menu.ps1关闭已打开的右键菜单,重新右键任意文件或文件夹。粘贴后应得到类似结果:
C:/测试目录/path with spaces & symbols.txt验证脚本会检查两个注册表入口,调用实际辅助脚本,再比较剪贴板结果:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\verify-copy-full-path-menu.ps1成功输出如下:
PASS: file and directory menus are registered; clipboard uses forward slashes.验证过程会暂时写入剪贴板。剪贴板原本含文本时,脚本会在结束前恢复原文本;原本没有文本时,测试路径会保留在剪贴板中。
卸载范围与复刻检查
卸载脚本只删除本功能创建的两个菜单键,以及 %LOCALAPPDATA%/CopyFullPathWithFilename 辅助目录:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\uninstall-copy-full-path-menu.ps1其他 Agent 复刻时需要核对以下边界:
- 使用
HKCU,避免要求管理员权限。 - 同时注册
*和Directory,覆盖文件与文件夹。 - 使用
-File传递%1,避免路径进入命令文本解析。 - 在辅助脚本内转换
/,不要改写资源管理器传入值。 - 用含中文、空格和
&的路径执行端到端验证。
这套结构把菜单注册、路径参数绑定和剪贴板处理分成三个清晰边界。安装器负责部署,注册表负责触发,辅助脚本负责文本格式。