註冊表中%1與%*對批處理參數傳遞的影響

http://bathome.net/archiver/tid-9794.html

hfg1977 發表於 2010-10-29 05:11

註冊表中%1與%*對批處理參數傳遞的影響

註冊表中%1與%*對bat文件參數傳遞的影響
[color=blue]目的[/color]: 把bat加到右鍵菜單,多選文件時,把多個文件作爲參數傳給bat; (不採用拖放)
[color=blue]遇到問題[/color]: 以 %1 傳遞會打開多個cmd窗口同步運行bat,而不是把"多個文件"傳遞給一個窗口運行bat.
                以 %*  傳遞會導致參數傳遞失敗. (同樣打開了多個cmd窗口同步運行bat)
[color=blue]期望[/color]: 大家把測試結果交流一下,都是哪種情況. 以便知道是個人系統問題還是普遍現象.
[color=blue]測試方法[/color]: 先空運行一次bat'再 單選\多選JPG圖片,右鍵菜單"JPG圖片測試" 運行.

測試代碼如下:[code]@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[/code]PS: 原來的系統沒有這種問題,打了補丁就出問題了. 又做了一遍雨林木風的.

[[i] 本帖最後由 hfg1977 於 2010-10-29 05:21 編輯 [/i]]

cjiabing 發表於 2011-4-15 14:38

[b] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=63449&ptid=9794]1#[/url] [i]hfg1977[/i] [/b]

原來也有人關注過!~

似乎是這樣的,你點擊每個文件使用右鍵時,該參數是傳遞給每個文件的,而並非共享到一個文件中。
但是,可以使用其它拐彎抹角的辦法吧,比如統一寫到一個文本中,然後再處理這個文本。
但這個問題仍然沒有解決,就是你每寫入一次,它就彈出一次那個黑框框框。
這個似乎是硬傷,那就是,每個文件上面的%1和%*都是獨立分配給每個文件的,不能像WMplayer一樣,一次性將多個歌曲導入播放,而不會顯示N多個wmplayer窗口。

想到一個問題,右鍵——將數據傳輸到當前CMD.EXE窗口,兄弟弄一下看得嗎?
rem hkcr   "\"……\"         是個好東西,以前早發現你的帖就好了,不過俺無師自通了。

cjiabing 發表於 2011-4-15 14:42

[i=s] 本帖最後由 cjiabing 於 2011-4-15 14:45 編輯 [/i]

順便把我的batmplayer用的內容給你分享一下,注意看,程序上的只能用%1,而不能用%*,目錄上的則相反。
”F /s %%1”是我的播放器的搜索參數,具體你找我發的batmplayer看看。[code]
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 %%*"

[/code]

hfg1977 發表於 2011-4-15 19:27

這麼老的貼被翻上來了呀,--------恩,所謂的"挖墳".
[quote]想到一個問題,右鍵——將數據傳輸到當前CMD.EXE窗口,兄弟弄一下看得嗎?[/quote]
這個問題思路是有的,還沒方法.
1. 建立一個bat 或 EXE 程序,關聯到Explorer的右鍵;
2. 上述程序獲得Explorer的右鍵發送的信息, 枚舉所有窗口找到另一個可見的CMD窗口(即你說的當前CMD.EXE窗口,其實它並不是當前窗口,它已經失去焦點了),將信息MSG轉發給它,MSG可以加上回車符讓它自動運行.
3.如果沒找到"另一個可見的CMD窗口"就新建一個(這個簡單);

這個思路關鍵在於CMD窗口對消息的接受與處理,我們並不是很清楚,需要做實驗.
bat(包括第三方命令行工具)對於發送MSG消息還是很不給力的,這是其自身的缺陷無法改變.
所以實驗需要用高級語言來實現.

cjiabing 發表於 2011-4-16 01:28

[b][url=http://www.bathome.net/redirect.php?goto=findpost&pid=75583&ptid=9794]4#[/url] [i]hfg1977[/i] [/b]
用VBS應該可以,上次見過一個好玩的東東!~
批處理與程序進行數據傳遞方面不怎麼討好,感覺批處理無法深入地對系統窗口進行操作,vbs在這方面則很強。

slore 發表於 2011-4-16 13:18

DDE

%啥無關係。。。
都傳了。

1.千千個人感覺貌似也啓動了吧。自己程序處理髮現有已經運行的,進程間通訊手段很多,把
參數傳給已經打開的程序再處理

2.DDE
程序啓動註冊一個系統DDE服務,然後右鍵的時候系統會將參數傳給註冊DDE服務的程序,
這種程序啓動好像是一次,內部寫個回調函數處理系統發的消息就是了。

但是2個方案都是要程序去處理下的。。。關鍵是程序,註冊表關聯沒辦法。。。
建議你的需求就“發送到。。。”吧 

頁: [1]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章