标题: [注册表类] 注册表中%1与%*对批处理参数传递的影响 [打印本页]
作者: hfg1977 时间: 2010-10-29 05:11 标题: 注册表中%1与%*对批处理参数传递的影响
注册表中%1与%*对bat文件参数传递的影响
目的: 把bat加到右键菜单,多选文件时,把多个文件作为参数传给bat; (不采用拖放)
遇到问题: 以 %1 传递会打开多个cmd窗口同步运行bat,而不是把"多个文件"传递给一个窗口运行bat.
以 %* 传递会导致参数传递失败. (同样打开了多个cmd窗口同步运行bat)
期望: 大家把测试结果交流一下,都是哪种情况. 以便知道是个人系统问题还是普遍现象.
测试方法: 先空运行一次bat'再 单选\多选JPG图片,右键菜单"JPG图片测试" 运行.
测试代码如下:- @echo off
- goto:end 控制更改注册表,下次生效,顶端加 rem 注释掉
- :start ===================================================
- for /f "skip=4 tokens=3" %%a in ('REG QUERY "HKLM\Software\hf'file" /v resize_pic 2^>nul') do set KEY_v=%%a
- if "%KEY_v%" EQU "1" (
- reg add "HKLM\SOFTWARE\Classes\jpegfile\shell\JPG图片测试&J\command" /ve /d "\"%~f0\" \"%%1\"" /f>nul
- reg add "HKLM\Software\hf'file" /v resize_pic /d 2 /f>nul
- ) else (
- reg add "HKLM\SOFTWARE\Classes\jpegfile\shell\JPG图片测试&J\command" /ve /d "\"%~f0\" %%*" /f>nul
- reg add "HKLM\Software\hf'file" /v resize_pic /d 1 /f>nul
- )
- :end ======================================================
- for /f "skip=4 tokens=3" %%a in ('REG QUERY "HKLM\Software\hf'file" /v resize_pic 2^>nul') do set KEY_v=%%a
- if "%KEY_v%" EQU "1" (echo 测试参数%%* :) else (echo 测试参数%%1 :)
- echo %%1=%1
- echo %%2=%2
- echo %%*=%*
- pause
- exit /b
复制代码
PS: 原来的系统没有这种问题,打了补丁就出问题了. 又做了一遍雨林木风的.
[ 本帖最后由 hfg1977 于 2010-10-29 05:21 编辑 ]
作者: cjiabing 时间: 2011-4-15 14:38
1# hfg1977
原来也有人关注过!~
似乎是这样的,你点击每个文件使用右键时,该参数是传递给每个文件的,而并非共享到一个文件中。
但是,可以使用其它拐弯抹角的办法吧,比如统一写到一个文本中,然后再处理这个文本。
但这个问题仍然没有解决,就是你每写入一次,它就弹出一次那个黑框框框。
这个似乎是硬伤,那就是,每个文件上面的%1和%*都是独立分配给每个文件的,不能像WMplayer一样,一次性将多个歌曲导入播放,而不会显示N多个wmplayer窗口。
想到一个问题,右键——将数据传输到当前CMD.EXE窗口,兄弟弄一下看得吗?
rem hkcr "\"……\" 是个好东西,以前早发现你的帖就好了,不过俺无师自通了。
作者: cjiabing 时间: 2011-4-15 14:42
本帖最后由 cjiabing 于 2011-4-15 14:45 编辑
顺便把我的batmplayer用的内容给你分享一下,注意看,程序上的只能用%1,而不能用%*,目录上的则相反。
”F /s %%1”是我的播放器的搜索参数,具体你找我发的batmplayer看看。- reg add HKCR\AudioCD\shell\open\command /t REG_SZ /ve /f /d "\"%##%\" %%1 %%*
- reg add HKCR\AudioCD\shell\PlayList /t REG_SZ /ve /f /d 添加到BatMPlayer播放列表
- reg add HKCR\AudioCD\shell\PlayList\command /t REG_SZ /ve /f /d "cmd /c echo;"%%1" %%*>>"\"%##0%PlayList\PL.txt\"
- reg add HKCR\Directory\shell\Playback /t REG_SZ /ve /f /d 使用BatMPlayer搜索
- reg add HKCR\Directory\shell\Playback\command /t REG_SZ /ve /f /d "\"%##%\" F %%*"
- reg add HKCR\Audio.mp3\shell\Playlist /t REG_SZ /ve /f /d 使用BatMPlayer搜索
- reg add HKCR\Audio.mp3\shell\Playlist\command /t REG_SZ /ve /f /d "\"%##%\" F /s %%1"
- reg add HKCR\Audio.mp3\shell\Playback /t REG_SZ /ve /f /d 使用BatMPlayer打开
- reg add HKCR\Audio.mp3\shell\Playback\command /t REG_SZ /ve /f /d "\"%##%\" %%1 %%*
- reg add HKCR\Audio.mp3\shell\addtoPlaylist /t REG_SZ /ve /f /d 加入BatMPlayer播放列表
- reg add HKCR\Audio.mp3\shell\addtoPlaylist\command /t REG_SZ /ve /f /d "cmd /c echo;"%%1" %%*>>"\"%##0%PlayList\PL.txt\"
- reg add HKCR\txtfile\shell\print\ /t REG_SZ /ve /f /d 使用BatMPlayer朗读
- reg add HKCR\txtfile\shell\print\command /t REG_SZ /ve /f /d "\"%##%\" BY %%1 %%*"
复制代码
作者: hfg1977 时间: 2011-4-15 19:27
这么老的贴被翻上来了呀,--------恩,所谓的"挖坟".
想到一个问题,右键——将数据传输到当前CMD.EXE窗口,兄弟弄一下看得吗?
这个问题思路是有的,还没方法.
1. 建立一个bat 或 EXE 程序,关联到Explorer的右键;
2. 上述程序获得Explorer的右键发送的信息, 枚举所有窗口找到另一个可见的CMD窗口(即你说的当前CMD.EXE窗口,其实它并不是当前窗口,它已经失去焦点了),将信息MSG转发给它,MSG可以加上回车符让它自动运行.
3.如果没找到"另一个可见的CMD窗口"就新建一个(这个简单);
这个思路关键在于CMD窗口对消息的接受与处理,我们并不是很清楚,需要做实验.
bat(包括第三方命令行工具)对于发送MSG消息还是很不给力的,这是其自身的缺陷无法改变.
所以实验需要用高级语言来实现.
作者: cjiabing 时间: 2011-4-16 01:28
4# hfg1977
用VBS应该可以,上次见过一个好玩的东东!~
批处理与程序进行数据传递方面不怎么讨好,感觉批处理无法深入地对系统窗口进行操作,vbs在这方面则很强。
作者: netdzb 时间: 2020-3-28 07:42
这个例子很好,我研究一下。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |