我想为 Windows 资源管理器创建上下文菜单操作选定多个文件。
HKEY_CLASSES_ROOT\*\shell\MyAction\command
我创建了一个具有字符串值的键
C:\python37\python.exe "c:\test\test.py" "%1"
此脚本目前仅显示命令行参数(用于调试目的):import sys; print(sys.argv); input()
当我选择两个文件 a.txt
在资源管理器中,b.txt
右键单击“MyAction”,然后:
我想让这个脚本命名为一次,传递给 Python 的命令行参数应该是
["c:\test\test.py", "c:\a.txt", "c:\b.txt"]
相反,我得到了这个脚本两次(每个文件独立执行一次),传递的命令行参数为:
["c:\test\test.py", "c:\a.txt"] ["c:\test\test.py", "c:\b.txt"]
如何使上下文菜单操作在选择 2 个文件时仅调用一次命令,并以这 2 个文件作为命令行参数?
总结我希望推出以下功能:
C:\python37\python.exe "c:\test\test.py" "a.txt" "b.raw" "file_with_noext"
并不是:
C:\python37\python.exe "c:\test\test.py" "a.txt"
C:\python37\python.exe "c:\test\test.py" "b.raw"
C:\python37\python.exe "c:\test\test.py" "file_with_noext"
当对多个文件使用上下文菜单操作时。
笔记:用什么方式打开多个文件?并且它的答案并不能解决问题;我尝试过但是当我选择多个文件HKEY_CLASSES_ROOT\SystemFileAssociations\*\shell\MyAction\command
(比如说a.txt
,,和)时此菜单项不会出现。b.raw
file_with_noext
testdir\
答案1
如果您已经得到答案,请原谅,但我认为唯一的方法是将您的应用程序的快捷方式放在 SendTo 文件夹中(您可以通过在运行窗口中输入 shell:sendto 打开它),然后突出显示两个文件并从“发送到”上下文菜单中选择您的程序。
答案2
我创建了一个小程序,可以彻底解决这个问题。 https://github.com/ge9/ExecuteCommand-Pipe
它基于此 Microsoft 示例代码:https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExecuteCommandVerb
它使用 Windows 的 COM(组件对象模型)技术,因此对传递的文件数量或路径长度没有限制。此外,它不涉及任何进程间通信,保留文件的顺序。打开文件的命令在注册表值中指定。有关详细信息,请参阅存储库。
答案3
概括
在注册表中将目标程序设置为上下文菜单创建文件.exe写道注册表文件文件。
在主程序中每 1 秒循环检查一次注册表文件存在。如果存在,则终止上下文菜单创建文件.exe并删除注册表文件文件。然后复制选定的文件路径并对其进行操作。
如果你的程序循环检查注册表文件,那么您需要在启动时或手动执行上下文菜单之前启动该程序。
我这样做了自动热键。
下面这两个 AutoHotkey 脚本允许您在 Windows 资源管理器中添加
Open With Chrome
上下文菜单项以打开多个选定的文件。您可以保留所有变量值,但如果您想更改值
contextMenu
和program
名称,请参阅3.1.
指示:
在同一目录中创建2个文件:
创建第一个程序添加到上下文菜单并创建启动快捷方式.ahk
RunAsAdmin
标签确保脚本以管理员身份运行(修复添加注册表值)。- 检查
If (!A_IsAdmin)
当前用户是否不是admin,A_IsAdmin 是内置的 AutoHotkey 变量,如果用户是管理员则返回 1,否则返回 0。 Run, \*RunAs "%A_ScriptFullPath%"
*运行方式参数以管理员身份运行脚本,“%A_ScriptFullPath%”获取当前执行脚本的完整路径。ExitApp
退出当前以非管理员权限运行的脚本实例。- 因为该
Run
命令以管理员权限再次运行脚本,所以它将跳过IF
条件并继续执行下面的代码。
- 检查
ContextMenuCreateFile:
标签创建上下文菜单创建文件.exe创建一个文件注册表文件并退出上下文菜单创建文件.exe写入文件后注册表文件. 确保在命令Ahk2Exe.exe
中指定路径的位置RunWait
。Add To Context Menu:
标签添加运行的注册表项上下文菜单创建文件.exe。- 将变量设置
contextMenu
为需要在上下文菜单中显示的内容。(名称program
设置为contextMenu
) - 设置
regPath
为您想要的注册表路径。 - 当它执行时
MsgBox
,检查命令是否添加到地址栏中的注册表中。
- 将变量设置
CreateStartupShortcut:
Label创建主程序的快捷方式使用 Chrome.exe 打开在启动文件夹中。
添加到上下文菜单并创建启动快捷方式.ahk
; =============Recommended Settings=============
#NoEnv
SetWorkingDir %A_ScriptDir%
#Warn
CoordMode, Mouse, Window
SendMode Input
#SingleInstance Force
SetTitleMatchMode 2
SetTitleMatchMode Fast
DetectHiddenWindows Off
DetectHiddenText On
#WinActivateForce
#NoTrayIcon
SetControlDelay 1
SetWinDelay 0
SetKeyDelay -1
SetMouseDelay -1
SetBatchLines -1
#Persistent
#MaxThreadsPerHotkey 2
; =============Recommended Settings=============
AddToContextMenuAndCreateStartupShortcut:
RunAsAdmin: ; =============RunAsAdmin=============
If (!A_IsAdmin) ; IF NOT Admin
{
Run, *RunAs "%A_ScriptFullPath%" ; Run script as admin
ExitApp ; Exit the current instance running without admin privileges
}
ContextMenuCreateFile: ; =============ContextMenuCreateFile=============
contextMenuCreateFileAhk :=
(LTrim
"#NoEnv
#NoTrayIcon
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
SetBatchLines -1
ContextMenuCreateFile:
FileDelete, reg.txt
FileAppend, , reg.txt
ExitApp
Return"
) ; contextMenuCreateFileAhk
FileDelete, Context Menu Create File.exe ; DEL Context Menu Create File.exe
FileDelete, Context Menu Create File.ahk ; DEL Context Menu Create File.ahk
FileAppend, %contextMenuCreateFileAhk%, Context Menu Create File.ahk ; MAKE Context Menu Create File.ahk
RunWait, C:\Program Files\AutoHotkey\Compiler\Ahk2Exe.exe /in "Context Menu Create File.ahk" /out "Context Menu Create File.exe" ; Convert AHK to EXE
FileDelete, Context Menu Create File.ahk ; DEL Context Menu Create File.ahk
AddToContextMenu: ; =============AddToContextMenu=============
path := "" ; path
program := "Context Menu Create File" ; program
contextMenu := "Open With Chrome" ; contextMenu
regPath := "HKCR\*\shell" ; regPath
StringReplace, regKey, contextMenu, %A_Space%, , A ; regKey
regKey := 0 regKey ; regKey
Loop, Files, %program%.exe, F ; Find Program.exe In Current Dir
{
path := A_LoopFileLongPath ; Set Program Path
}
cmd :=
(LTrim
"reg add """ regPath "\" regKey """ /ve /t REG_SZ /d """ contextMenu """ /f
reg add """ regPath "\" regKey "\command"" /ve /t REG_SZ /d ""\""" path "\""`"" /f"
) ; Registry
FileDelete, Add To Context Menu.bat ; CREATE Add To Context Menu.bat
FileAppend, %cmd%, Add To Context Menu.bat ; CREATE Add To Context Menu.bat
RunWait, Add To Context Menu.bat, , Hide ; RUN Add To Context Menu.bat (*RunAs ADMIN)
FileDelete, Add To Context Menu.bat ; DEL Add To Context Menu.bat
Run, regedit ; regedit
WinWait, Registry Editor ahk_class RegEdit_RegEdit ahk_exe regedit.exe ; Registry
Sleep, 333
ControlSetText, Edit1, %regPath%\%regKey%\command, Registry Editor ahk_class RegEdit_RegEdit ahk_exe regedit.exe ; regPath
ControlFocus, Edit1, Registry Editor ahk_class RegEdit_RegEdit ahk_exe regedit.exe ; regPath
ControlSend, Edit1, {Enter}, Registry Editor ahk_class RegEdit_RegEdit ahk_exe regedit.exe ; regPath
ControlSend, SysListView321, {Control Down}{NumpadAdd}{Control Up}, Registry Editor ahk_class RegEdit_RegEdit ahk_exe regedit.exe ; regPath
ControlSend, SysListView321, {F5}, Registry Editor ahk_class RegEdit_RegEdit ahk_exe regedit.exe ; regPath
MsgBox, 262192, CHECK, Check If Added %contextMenu% To Registry ; CHECK
CreateStartupShortcut: ; =============CreateStartupShortcut=============
path := "" ; path
program := contextMenu ; program
Loop, Files, %program%.exe, F ; Find Program.exe In Current Dir
{
path := A_LoopFileLongPath ; Set Program Path
}
FileCreateShortcut, %path%, %A_Startup%\%program%.lnk ; Create Startup Shortcut
Run, %A_Startup%, , Max ; Check If Shortcut Created
Run, "%program%.exe" ; Run Program
MsgBox, 262144, CHECK, Check If Shortcut Created ; CHECK
ExitApp ; ExitApp
Return
- 创建第二个程序使用 Chrome.ahk 打开这是主程序。
- 这里
Loop
创建了一个 a,并每隔 1 秒检查一次注册表文件存在。 IfExist, reg.txt
它杀死了上下文菜单创建文件.exe并删除注册表文件。- 然后它激活 explorer.exe 窗口并将所有选定的文件路径复制到剪贴板。
If CLIPBOARD contains .,\
确保;确定剪贴板包含路径“\”带延伸“。”。- 选定文件的列表保存在
selectedFiles
变量中。 - 下面的循环
chromeParams := ""
循环遍历选定的文件,获取filePath
s 并用双引号将其括起来,并将StringReplace
Windows 路径替换为 url 文件路径(例如:C:\path\file.jpg
to)file:///path/file.jpg
。 - 然后将
filePath
连接到chromeParams
。 StringTrimRight
从字符串中删除最后一个空格chromeParams
。- 然后
Run, chrome.exe %chromeParams%
使用(选定文件列表)执行%chromeParams%
。(如果该命令未打开 Chrome,则输入 Chrome 的完整路径,例如:Run, C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
使用相同的参数)
- 这里
使用 Chrome.ahk 打开
; =============Recommended Settings=============
#NoEnv
SetWorkingDir %A_ScriptDir%
#Warn
CoordMode, Mouse, Window
SendMode Input
#SingleInstance Force
SetTitleMatchMode 2
SetTitleMatchMode Fast
DetectHiddenWindows Off
DetectHiddenText On
#WinActivateForce
#NoTrayIcon
SetControlDelay 1
SetWinDelay 0
SetKeyDelay -1
SetMouseDelay -1
SetBatchLines -1
#Persistent
#MaxThreadsPerHotkey 2
; =============Recommended Settings=============
OpenWithChrome:
Loop ; Loop Start
{
Sleep, 1000 ; Fix High CPU
IfExist, reg.txt ; IF reg.txt EXIST
{
RunWait, cmd /c taskkill /im "Context Menu Create File.exe" /f, , Hide ; Fix Opening 2 Compose Windows
FileDelete, reg.txt ; DEL reg.txt
WinActivate, ahk_class CabinetWClass ahk_exe explorer.exe ; Explorer
CLIPBOARD := "" ; Clear Clipboard
Send, {Control Down}{c}{Control Up} ; Copy File Paths
ClipWait, 0 ; Clip Wait
If CLIPBOARD contains .,\ ; IF CLIPBOARD contains .,\
{
selectedFiles := CLIPBOARD ; selectedFiles
chromeParams := "" ; chromeParams
Loop, Parse, selectedFiles, `n, `r ; Loop Start selectedFiles
{
filePath := """file:///" A_LoopField """" ; filePath
StringReplace, filePath, filePath, \, /, A ; Replace \ with /
chromeParams .= filePath . " " ; chromeParams .= %filePath%,
}
StringTrimRight, chromeParams, chromeParams, 1 ; Remove Last Space
Run, chrome.exe %chromeParams% ; Open Files In Chrome
}
}
}
Return
转换两者添加到上下文菜单并创建启动快捷方式.ahk和使用 Chrome.ahk 打开到EXE文件使用同一目录中的文件Ahk2Exe 工具-->(在开始菜单中找到,只需浏览文件并点击转换)
执行
Add To Context Menu And Create Startup Shortcut.exe
选择文件,右键单击,然后使用 Chrome 打开应该出现上下文菜单项。