无忧启动论坛

标题: 关于右键增加复制文件路径的讨论 [打印本页]

作者: wjgyz740526    时间: 2024-11-4 16:30
标题: 关于右键增加复制文件路径的讨论
本帖最后由 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写入注册表,选中多个文件的时候,却又能弹出各个文件的路径。

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



作者: 窄口牛    时间: 2024-11-4 16:41
为啥不要引号呢?有引号保险哇?
作者: wjgyz740526    时间: 2024-11-4 16:47
窄口牛 发表于 2024-11-4 16:41
为啥不要引号呢?有引号保险哇?

很多时候不需要引号啊
作者: fruds9981    时间: 2024-11-4 16:56
标记以方便后续学习
作者: hlowld    时间: 2024-11-4 17:08
[HKEY_CLASSES_ROOT\*\shell\复制路径\command]
@="mshta.exe vbscript:createobject(\"wscript.shell\").run(\"cmd /c ECHO %1|CLIP\",0)(window.close)"
这样没有双引号,也没有黑窗口
作者: wjgyz740526    时间: 2024-11-4 17:10
hlowld 发表于 2024-11-4 17:08
[HKEY_CLASSES_ROOT\*\shell\复制路径\command]
@="mshta.exe vbscript:createobject(\"wscript.shell\"). ...

vbscript方式不支持多文件同时获取路径
作者: c2y    时间: 2024-11-4 17:24
一个是1.0版,一个是2.1,都是32位版本。注册表正确,两个效果相同。
作者: baby1277    时间: 2024-11-4 17:31
很多程序浏览框输入框带引号就报错,带引号只是编写代码方便,用户很不方便。
再说下,一般用户不需要同时复制多条路径,这个也是大师们的特殊需要。
还有那个黑框框,如果每个菜单都是这样估计你早就问候3哥了
所以一般用户需求就是:复制一条路径,不带引号,不要黑框框,就行了。
我们是一般用户就不折腾了,你们折腾好了我在看下。
作者: Bluebells    时间: 2024-11-4 17:31
wjgyz740526 发表于 2024-11-4 17:10
vbscript方式不支持多文件同时获取路径

然而人家的核心使用的是cmd, 只是使用mshta调用以防止出现黑窗口罢了
作者: ql1307096    时间: 2024-11-4 17:31
单为了实现快捷复制文件路径的话,使用Everything更加方便,快速搜索到文件后右键就可以复制完整路径了,还支持多选。
作者: wjgyz740526    时间: 2024-11-4 17:32
c2y 发表于 2024-11-4 17:24
一个是1.0版,一个是2.1,都是32位版本。注册表正确,两个效果相同。

关键是正常的win64系统安装有效,提取跟踪出来的pe64下无效,不知道什么原因啊
作者: hmaaaa    时间: 2024-11-4 17:41
謝謝大大分享~感恩 ^^ 有您真好~!辛苦了!
作者: wjgyz740526    时间: 2024-11-4 17:50
Bluebells 发表于 2024-11-4 17:31
然而人家的核心使用的是cmd, 只是使用mshta调用以防止出现黑窗口罢了

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

作者: hlowld    时间: 2024-11-4 18:01
发一个我自己在用的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
适合放在批处理中执行,如果要在命令行窗口执行,需将%%替换为%
作者: Bluebells    时间: 2024-11-4 19:08
附件中的那个什么 CopyPath Ext 需要 .Net Framework2.0 组件, 绝大多数 WinPE 都不会集成这个
PS: 一些巨无霸 WinPE 会集成 .Net Framework
作者: wjgyz740526    时间: 2024-11-4 19:33
Bluebells 发表于 2024-11-4 19:08
附件中的那个什么 CopyPath Ext 需要 .Net Framework2.0 组件, 绝大多数 WinPE 都不会集成这个
PS: 一些巨 ...

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

我跟踪的时候,系统是报告在clr_2.0文件夹有写入动作
作者: cqh    时间: 2024-11-4 19:47
瞧一瞧
作者: vaf    时间: 2024-11-4 20:08
从不喜欢此功能. 因为地址栏可替代.

作者: htmlc4    时间: 2024-11-4 20:20
正常来说还是需要有引号的,cli下的路径往往都需要引号
作者: GXNNYWF    时间: 2024-11-4 20:49
从不喜欢此功能. 因为地址栏可替代
作者: 孟仁飞    时间: 2024-11-5 09:10
学习
作者: ppll2030    时间: 2024-11-5 10:39
注册表无法同时传递多文件,所有纯脚本基本无解,除非调用dll文件。
以前折中的办法,就是利用右键发送的功能,直接传递多文件到脚本
现在基本都是用第三方资源管理器,直接自带该功能。

作者: wjgyz740526    时间: 2024-11-5 10:53
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写入注册表,选中多个文件的时候,却又能弹出各个文件的路径。

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

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

Windows Registry Editor Version 5.00

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

感谢分享
作者: wjgyz740526    时间: 2024-11-6 15:18
ppll2030 发表于 2024-11-5 12:19
常用的bat、vbs等脚本都可以支持多文件,完成这个工作。
问题就在于,右键是通过注册表来传递参数的,
...

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

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




作者: softwarezheng1    时间: 2024-11-6 18:14
虽然有点长,但是还是能学到东西
作者: jabbie    时间: 2024-11-12 13:15
看看咋说的
作者: wjgyz740526    时间: 2024-11-12 13:46
jabbie 发表于 2024-11-12 13:15
看看咋说的

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




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3