无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 923|回复: 29
打印 上一主题 下一主题

[讨论] 关于右键增加复制文件路径的讨论

[复制链接]
跳转到指定楼层
1#
发表于 2024-11-4 16:30:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 wjgyz740526 于 2024-11-5 10:51 编辑

论坛里关于右键增加复制文件路径的讨论很多,大致有以下几种方法:1、调用系统shell32.dll,缺点是路径两端有双引号,优点是支持多个文件同时获取路径;2、vbscript方式,优点是没有双引号,缺点是不支持多文件获取路径;3、cmd方式,优点是没有双引号,缺点是有黑窗口(是不是支持多文件没测试);4、第三方软件,比如nircdm(不支持多文件复制路径),还有什么path copy copy(功能很强大,英文版,非单文件,)等等
很久以前,xp时代,我找到一个dll文件,直接注册就可以增加右键复制路径的菜单,但是不支持64位系统。前几天看到下面的软件,win10LTSC_x64下安装测试,很不错,支持多文件、无双引号,跟踪了下,就两个文件,一个dll一个cpl,pe下把文件复制到对应目录,导入注册表,却没有什么效果,换了个系统测试、跟踪、导入还是这样。又尝试直接在pe下安装跟踪,软件直接报错,不支持安装,换了几个pe都这样,很无奈。


现在把软件发出来,大家看看,欢迎讨论,有更好的方案也请分享。

附件.7z (384.08 KB, 下载次数: 20)

附件里面包括:1、xp时代的pathcopyEx.dll,有人能改成支持64位嘛?2、CopyPathExt_Setup.exe,大家测试跟踪下;3、我跟踪出来的文件

昨天经过坛友指点,CopyPathExt_Setup.exe需要.Net环境,pe下就算了。

然后,做了以下测试,感觉pecmd应该可以搞定,

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\PecmdPathCopy]
@="复制文件完整路径"
"ICON"="shell32.dll,112"

[HKEY_CLASSES_ROOT\*\shell\PecmdPathCopy\command]
@="\"X:\\WINDOWS\\SYSTEM32\\PECMD.EXE\" \"ENVI^ Clipboard=%0\""

这个注册表能复制路径,但多文件无效,按注册表参数的官方说法,%0代表选择的第一个文件,%*代表选择的所有文件,各路径之间以空格相连,然而,改成这样:

[HKEY_CLASSES_ROOT\*\shell\PecmdPathCopy\command]
@="\"X:\\WINDOWS\\SYSTEM32\\PECMD.EXE\" \"ENVI^ Clipboard=%*\""


剪贴板却没有数据。

我尝试用pecmd mess %0写入注册表,选中多个文件的时候,却又能弹出各个文件的路径。

各位达人尝试下吧,看看有什么好的办法


30#
 楼主| 发表于 2024-11-12 13:46:32 | 只看该作者

算了不折腾了,github上有很多这样的软件,找一个汉化下即可
回复

使用道具 举报

29#
发表于 2024-11-12 13:15:33 | 只看该作者
看看咋说的

点评

算了不折腾了,github上有很多这样的软件,找一个汉化下即可  详情 回复 发表于 2024-11-12 13:46
回复

使用道具 举报

28#
发表于 2024-11-6 18:14:34 | 只看该作者
虽然有点长,但是还是能学到东西
回复

使用道具 举报

27#
 楼主| 发表于 2024-11-6 15:18:57 来自手机 | 只看该作者
ppll2030 发表于 2024-11-5 12:19
常用的bat、vbs等脚本都可以支持多文件,完成这个工作。
问题就在于,右键是通过注册表来传递参数的,
...

搜了很多资料,总算明白了。

注册表中,%*获取到的多个选中的文件路径实际上是以REG_MULTI_SZ数据类型存储的。这意味着路径列表被存储为一个以null字符(`\0`)分隔的字符串数组,并且以两个连续的null字符(`\0\0`)作为结束标志。
而剪贴板(Clipboard)本身并不直接支持注册表的REG_MULTI_SZ数据类型。如果要在剪贴板和注册表之间传递数据,需要把数据类型进行转换。



回复

使用道具 举报

26#
发表于 2024-11-5 13:21:26 | 只看该作者

感谢分享
回复

使用道具 举报

25#
发表于 2024-11-5 12:58:45 | 只看该作者
感谢分享
回复

使用道具 举报

24#
发表于 2024-11-5 12:19:21 | 只看该作者
本帖最后由 ppll2030 于 2024-11-5 12:21 编辑
wjgyz740526 发表于 2024-11-5 10:53
做了以下测试,感觉pecmd应该可以搞定,

Windows Registry Editor Version 5.00

常用的bat、vbs等脚本都可以支持多文件,完成这个工作。
问题就在于,右键是通过注册表来传递参数的,
网上关于这个%*的翻译和解释个人认为有歧义,
到底是代表所有文件,还是代表所有参数
实际操作中,注册表对%*是不能识别的,也没有看到相关具体实例。
所以只能是绕开,或是开发dll来收集,再执行。

点评

搜了很多资料,总算明白了。 注册表中,%*获取到的多个选中的文件路径实际上是以REG_MULTI_SZ数据类型存储的。这意味着路径列表被存储为一个以null字符(`\0`)分隔的字符串数组,并且以两个连续的null字符(`\0\  详情 回复 发表于 2024-11-6 15:18
回复

使用道具 举报

23#
 楼主| 发表于 2024-11-5 10:53:06 | 只看该作者
ppll2030 发表于 2024-11-5 10:39
注册表无法同时传递多文件,所有纯脚本基本无解,除非调用dll文件。
以前折中的办法,就是利用右键发送的 ...

做了以下测试,感觉pecmd应该可以搞定,

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\PecmdPathCopy]
@="复制文件完整路径"
"ICON"="shell32.dll,112"

[HKEY_CLASSES_ROOT\*\shell\PecmdPathCopy\command]
@="\"X:\\WINDOWS\\SYSTEM32\\PECMD.EXE\" \"ENVI^ Clipboard=%0\""

这个注册表能复制路径,但多文件无效,按注册表参数的官方说法,%0代表选择的第一个文件,%*代表选择的所有文件,各路径之间以空格相连,然而,改成这样:

[HKEY_CLASSES_ROOT\*\shell\PecmdPathCopy\command]
@="\"X:\\WINDOWS\\SYSTEM32\\PECMD.EXE\" \"ENVI^ Clipboard=%*\""


剪贴板却没有数据。

我尝试用pecmd mess %0写入注册表,选中多个文件的时候,却又能弹出各个文件的路径。

各位达人尝试下吧,看看有什么好的办法

点评

常用的bat、vbs等脚本都可以支持多文件,完成这个工作。 问题就在于,右键是通过注册表来传递参数的, 网上关于这个%*的翻译和解释个人认为有歧义, 到底是代表所有文件,还是代表所有参数。 实际操作中,注册表  详情 回复 发表于 2024-11-5 12:19
回复

使用道具 举报

22#
发表于 2024-11-5 10:39:58 | 只看该作者
注册表无法同时传递多文件,所有纯脚本基本无解,除非调用dll文件。
以前折中的办法,就是利用右键发送的功能,直接传递多文件到脚本
现在基本都是用第三方资源管理器,直接自带该功能。

点评

做了以下测试,感觉pecmd应该可以搞定, Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\PecmdPathCopy] @="复制文件完整路径" "ICON"="shell32.dll,112" [HKEY_CLASSES_ROOT\*\shell  详情 回复 发表于 2024-11-5 10:53
回复

使用道具 举报

21#
发表于 2024-11-5 09:10:32 | 只看该作者
学习
回复

使用道具 举报

20#
发表于 2024-11-4 20:49:51 | 只看该作者
从不喜欢此功能. 因为地址栏可替代
回复

使用道具 举报

19#
发表于 2024-11-4 20:20:05 | 只看该作者
正常来说还是需要有引号的,cli下的路径往往都需要引号
回复

使用道具 举报

18#
发表于 2024-11-4 20:08:06 | 只看该作者
从不喜欢此功能. 因为地址栏可替代.
回复

使用道具 举报

17#
发表于 2024-11-4 19:47:15 | 只看该作者
瞧一瞧
回复

使用道具 举报

16#
 楼主| 发表于 2024-11-4 19:33:25 来自手机 | 只看该作者
Bluebells 发表于 2024-11-4 19:08
附件中的那个什么 CopyPath Ext 需要 .Net Framework2.0 组件, 绝大多数 WinPE 都不会集成这个
PS: 一些巨 ...

难怪呢,我想起来了你说的是对的

我跟踪的时候,系统是报告在clr_2.0文件夹有写入动作
回复

使用道具 举报

15#
发表于 2024-11-4 19:08:36 | 只看该作者
附件中的那个什么 CopyPath Ext 需要 .Net Framework2.0 组件, 绝大多数 WinPE 都不会集成这个
PS: 一些巨无霸 WinPE 会集成 .Net Framework

点评

难怪呢,我想起来了你说的是对的 我跟踪的时候,系统是报告在clr_2.0文件夹有写入动作  详情 回复 发表于 2024-11-4 19:33
回复

使用道具 举报

14#
发表于 2024-11-4 18:01:54 | 只看该作者
发一个我自己在用的cmd复制名称和路径,mshta调用避免黑窗口
reg add "HKEY_CLASSES_ROOT\*\shell\复制路径\command" /ve /t REG_SZ /d "mshta.exe vbscript:createobject(\"wscript.shell\").run(\"cmd /c ECHO %%1^|CLIP\",0)(window.close)" /f

reg add "HKEY_CLASSES_ROOT\*\shell\复制名称\command" /ve /t REG_SZ /d "mshta.exe vbscript:createobject(\"wscript.shell\").run(\"cmd /c for %%%%F in (\"\"%%1\"\") do ECHO %%%%~nxF^|CLIP\",0)(window.close)" /f
适合放在批处理中执行,如果要在命令行窗口执行,需将%%替换为%
回复

使用道具 举报

13#
 楼主| 发表于 2024-11-4 17:50:13 来自手机 | 只看该作者
Bluebells 发表于 2024-11-4 17:31
然而人家的核心使用的是cmd, 只是使用mshta调用以防止出现黑窗口罢了

刚没细看后面的代码,看到vbscript以为一样的,他这个还真是cmd方式,但应该不支持多文件
回复

使用道具 举报

12#
发表于 2024-11-4 17:41:36 | 只看该作者
謝謝大大分享~感恩 ^^ 有您真好~!辛苦了!
回复

使用道具 举报

11#
 楼主| 发表于 2024-11-4 17:32:11 来自手机 | 只看该作者
c2y 发表于 2024-11-4 17:24
一个是1.0版,一个是2.1,都是32位版本。注册表正确,两个效果相同。

关键是正常的win64系统安装有效,提取跟踪出来的pe64下无效,不知道什么原因啊
回复

使用道具 举报

10#
发表于 2024-11-4 17:31:53 | 只看该作者
单为了实现快捷复制文件路径的话,使用Everything更加方便,快速搜索到文件后右键就可以复制完整路径了,还支持多选。
回复

使用道具 举报

9#
发表于 2024-11-4 17:31:49 | 只看该作者
wjgyz740526 发表于 2024-11-4 17:10
vbscript方式不支持多文件同时获取路径

然而人家的核心使用的是cmd, 只是使用mshta调用以防止出现黑窗口罢了

点评

刚没细看后面的代码,看到vbscript以为一样的,他这个还真是cmd方式,但应该不支持多文件  详情 回复 发表于 2024-11-4 17:50
回复

使用道具 举报

8#
发表于 2024-11-4 17:31:31 | 只看该作者
很多程序浏览框输入框带引号就报错,带引号只是编写代码方便,用户很不方便。
再说下,一般用户不需要同时复制多条路径,这个也是大师们的特殊需要。
还有那个黑框框,如果每个菜单都是这样估计你早就问候3哥了
所以一般用户需求就是:复制一条路径,不带引号,不要黑框框,就行了。
我们是一般用户就不折腾了,你们折腾好了我在看下。
回复

使用道具 举报

7#
发表于 2024-11-4 17:24:14 | 只看该作者
一个是1.0版,一个是2.1,都是32位版本。注册表正确,两个效果相同。

点评

关键是正常的win64系统安装有效,提取跟踪出来的pe64下无效,不知道什么原因啊  详情 回复 发表于 2024-11-4 17:32
回复

使用道具 举报

6#
 楼主| 发表于 2024-11-4 17:10:24 | 只看该作者
hlowld 发表于 2024-11-4 17:08
[HKEY_CLASSES_ROOT\*\shell\复制路径\command]
@="mshta.exe vbscript:createobject(\"wscript.shell\"). ...

vbscript方式不支持多文件同时获取路径

点评

然而人家的核心使用的是cmd, 只是使用mshta调用以防止出现黑窗口罢了  详情 回复 发表于 2024-11-4 17:31
回复

使用道具 举报

5#
发表于 2024-11-4 17:08:00 | 只看该作者
[HKEY_CLASSES_ROOT\*\shell\复制路径\command]
@="mshta.exe vbscript:createobject(\"wscript.shell\").run(\"cmd /c ECHO %1|CLIP\",0)(window.close)"
这样没有双引号,也没有黑窗口

点评

vbscript方式不支持多文件同时获取路径  详情 回复 发表于 2024-11-4 17:10
回复

使用道具 举报

4#
发表于 2024-11-4 16:56:32 | 只看该作者
标记以方便后续学习
回复

使用道具 举报

3#
 楼主| 发表于 2024-11-4 16:47:38 | 只看该作者
窄口牛 发表于 2024-11-4 16:41
为啥不要引号呢?有引号保险哇?

很多时候不需要引号啊
回复

使用道具 举报

2#
发表于 2024-11-4 16:41:06 来自手机 | 只看该作者
为啥不要引号呢?有引号保险哇?

点评

很多时候不需要引号啊  详情 回复 发表于 2024-11-4 16:47
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-23 20:45

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表