返回列表 发帖
本帖最后由 aloha20200628 于 2024-10-22 22:53 编辑

回复 1# lforl

参见一》https://cloud.tencent.com/developer/news/436620
参见二》https://www.xitongzhijia.net/xtjc/20170105/90289.html

TOP

本帖最后由 aloha20200628 于 2024-10-25 18:16 编辑

回复 1# lforl

一楼的注册表代码沿用了系统为资源管理器开启 ‘复制路径’ 右键菜单的通道,实测不能直接 ‘套壳’ 这段批处代码,但通过资源管理器的 ‘发送到’ 右键菜单机制确实可以挂载类似的批处代码,从而实现楼主的要求,以下是一个最简方法示例》
一。创建一个批处理脚本(代码如下)假设存为 sendTo.bat
二。复制 sendTo.bat 到 "C:\Users\本机用户名\AppData\Roaming\Microsoft\Windows\SendTo" 系统目录中(可在资源管理器地址栏输入 shell:sendto 开启该目录),其后会在资源管理器 '发送到' 右键菜单中出现名为 sendTo.bat 的选项,当单选或多选文件或目录后,点击此右键菜单选项即可完成被选结果 '无双引号包裹' 传至剪贴板的操作
@echo off &(for %%i in (%*) do @echo,%%~i)|clip.exe&exit/bCOPY
但这个用法至少有两点限制》
一。被选文件或目录的字符总量不能超过8K,即受限于系统命令行参数的字符总量限制
二。批处脚本被调用过程会导致闪屏,这是因开关cmd窗口所致

改用 vbs 或 jscript 代码替换批处脚本是一个没有闪屏和突破选择集字符量8K限制的解决方案,以下代码是一个jscript版本,假设存为 sendTo.js,直接复制到上述系统目录中,其后会在资源管理器 '发送到' 右键菜单中出现名为 sendTo.js 的选项,当单选或多选文件或目录后,点击此右键菜单选项即可完成被选结果 '无双引号包裹' 传至剪贴板的操作
v=WSH.arguments, ws=WSH.createObject('WScript.shell');
for (s='',n=0,l=v.length; n<l; n++) s+=v(n).replace(/\"/g,'')+'\r\n';
fso=WSH.createObject('Scripting.FileSystemObject');
tF=ws.expandEnvironmentStrings('%temp%')+'\\_.clipT';
fp=fso.OpenTextFile(tF,2,true), fp.write(s.slice(0,-2)), fp.close();
ws.run('cmd.exe /c clip.exe<'+tF+'&&del/q '+tF, 0, false), WSH.quit();COPY

TOP

本帖最后由 aloha20200628 于 2024-10-26 15:14 编辑

回复 8# lforl

   注册表右键菜单定义中的批处代码可以识别 %1, %2, ..., %L 这类命令行参数,但不识别 %*,其中每个 %n 参数变量指向被选择的单个文件或目录,系统会为每个选择项自动开启一个cmd窗口进程,分别取用对应的 %n 运行右键菜单定义中的同一段代码,因此当选择项(文件或目录)较多时可能会导致系统卡死,当选择项未被双引号包裹但其中包含了&^等特殊字符时也会被系统拦截退出...
   楼主引用的 http://www.bathome.net/viewthread.php?tid=69150 其二楼代码,在具体运行时也会因应文件选择数量相应开启多个cmd窗口进程(可能因运行速度快而闪过未被察觉),可用如下代码(由二楼代码裁剪而成)予以验证...
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\SystemFileAssociations\.pdf\Shell\rename1]
@="自定义重命名"
[HKEY_CLASSES_ROOT\SystemFileAssociations\.pdf\Shell\rename1\Command]
@="cmd /v:on /c (for %%i in (\"%1\") do echo,%%~ni)&pause"COPY
系统为资源管理器内置的 ‘复制路径’ 右键功能实现了一次性传递全部选择集至剪贴板(选择项被双引号包裹), 系统内置的 ‘sendTo(发送到)’ 右键菜单机制亦可一次性传递全部选择集(命令行参数)至接收方(如挂载的批处脚本或vbs/jscript等脚本),例如7楼示例代码完成的将无双引号包裹的所有选择项传入剪贴板... 也许微软对用右键菜单一次性获取选择集也就提供了如此 ‘捷径’ 而已...

TOP

回复 13# lforl

从资源管理器拖入命令行的路径参数》如果有空格则会被系统自动包裹双引号因此会保全其中的 &^=() 等特殊字符,如果无空格则因未被包裹双引号而不能保全其中的 &^=() 等特殊字符,这是一个被老东家多年 '视而不见的老毛病'...

TOP

返回列表