Board logo

标题: [注册表类] 注册表中%1与%*对批处理参数传递的影响 [打印本页]

作者: hfg1977    时间: 2010-10-29 05:11     标题: 注册表中%1与%*对批处理参数传递的影响

注册表中%1与%*对bat文件参数传递的影响
目的: 把bat加到右键菜单,多选文件时,把多个文件作为参数传给bat; (不采用拖放)
遇到问题: 以 %1 传递会打开多个cmd窗口同步运行bat,而不是把"多个文件"传递给一个窗口运行bat.
                以 %*  传递会导致参数传递失败. (同样打开了多个cmd窗口同步运行bat)
期望: 大家把测试结果交流一下,都是哪种情况. 以便知道是个人系统问题还是普遍现象.
测试方法: 先空运行一次bat'再 单选\多选JPG图片,右键菜单"JPG图片测试" 运行.

测试代码如下:
  1. @echo off
  2. goto:end 控制更改注册表,下次生效,顶端加 rem 注释掉
  3. :start ===================================================
  4. for /f "skip=4 tokens=3" %%a in ('REG QUERY "HKLM\Software\hf'file" /v resize_pic 2^>nul') do set KEY_v=%%a
  5. if "%KEY_v%" EQU "1" (
  6. reg add "HKLM\SOFTWARE\Classes\jpegfile\shell\JPG图片测试&J\command" /ve /d "\"%~f0\" \"%%1\"" /f>nul
  7. reg add "HKLM\Software\hf'file" /v resize_pic /d 2 /f>nul
  8. ) else (
  9. reg add "HKLM\SOFTWARE\Classes\jpegfile\shell\JPG图片测试&J\command" /ve /d "\"%~f0\" %%*" /f>nul
  10. reg add "HKLM\Software\hf'file" /v resize_pic /d 1 /f>nul
  11. )
  12. :end ======================================================
  13. for /f "skip=4 tokens=3" %%a in ('REG QUERY "HKLM\Software\hf'file" /v resize_pic 2^>nul') do set KEY_v=%%a
  14. if "%KEY_v%" EQU "1" (echo 测试参数%%* :) else (echo 测试参数%%1 :)
  15. echo %%1=%1
  16. echo %%2=%2
  17. echo %%*=%*
  18. pause
  19. 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看看。
  1. reg add HKCR\AudioCD\shell\open\command /t REG_SZ /ve /f /d "\"%##%\" %%1 %%*
  2. reg add HKCR\AudioCD\shell\PlayList /t REG_SZ /ve /f /d  添加到BatMPlayer播放列表
  3. reg add HKCR\AudioCD\shell\PlayList\command /t REG_SZ /ve /f /d "cmd /c echo;"%%1" %%*>>"\"%##0%PlayList\PL.txt\"
  4. reg add HKCR\Directory\shell\Playback /t REG_SZ /ve /f /d 使用BatMPlayer搜索
  5. reg add HKCR\Directory\shell\Playback\command /t REG_SZ /ve /f /d "\"%##%\" F %%*"
  6. reg add HKCR\Audio.mp3\shell\Playlist /t REG_SZ /ve /f /d 使用BatMPlayer搜索
  7. reg add HKCR\Audio.mp3\shell\Playlist\command /t REG_SZ /ve /f /d "\"%##%\" F /s %%1"
  8. reg add HKCR\Audio.mp3\shell\Playback /t REG_SZ /ve /f /d 使用BatMPlayer打开
  9. reg add HKCR\Audio.mp3\shell\Playback\command /t REG_SZ /ve /f /d "\"%##%\" %%1 %%*
  10. reg add HKCR\Audio.mp3\shell\addtoPlaylist /t REG_SZ /ve /f /d  加入BatMPlayer播放列表
  11. reg add HKCR\Audio.mp3\shell\addtoPlaylist\command /t REG_SZ /ve /f /d "cmd /c echo;"%%1" %%*>>"\"%##0%PlayList\PL.txt\"
  12. reg add HKCR\txtfile\shell\print\ /t REG_SZ /ve /f /d 使用BatMPlayer朗读
  13. 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