当用户右键单击文件类型时,我已经可以运行批处理文件了。我怎样才能使每个突出显示的组只运行一个实例并将所有文件作为参数。 目前,当用户“转移点击”
时,它会为每个文件运行单个实例 很可能有更好的方法来说明这一点......你可以看出为什么我在搜索它时遇到了麻烦。感谢
答案 0 :(得分:3)
如果您创建批处理文件并将其放在桌面上,则可以选择多个文件并将其放在该批处理文件中。它们将作为多个参数传递给文件。
例如,假设您将dropped.bat
放在桌面上,它看起来像这样:
@echo off
echo %*
pause
现在假设您有三个文件x
,y
和z
,如果您多次选择它们并将其放在dropped.bat
上,您会看到一个命令窗口在其中提出这个文本:
C:\Users\alavinio\Desktop\x C:\Users\alavinio\Desktop\y C:\Users\alavinio\Desktop\z
Press any key to continue . . .
这是你能得到的最接近的。右键单击和打开语义期望为每个选定项启动新的可执行文件,通常这些可执行文件检查自己的另一个实例,如果他们看到一个,则将参数发送到该现有进程,并自行终止。您可以使用任务管理器或Process Explorer实际观察到这种情况。
答案 1 :(得分:3)
通常,文件关联多选择调用将启动程序的多个实例,程序本身必须自己处理它(或者在DDE或IDropTarget的帮助下)
在批处理文件中实现这一点非常困难,这个例子应该让你开始:
@echo off
setlocal ENABLEEXTENSIONS
set guid=e786496d-1b2e-4a49-87b7-eb325c8cc64d
set id=%RANDOM%
FOR /F "tokens=1,2,3 delims=.,:/\ " %%A IN ("%TIME%") DO SET id=%id%%%A%%B%%C
set sizeprev=0
>>"%temp%\%guid%.lock" echo %id%
>>"%temp%\%guid%.list" echo %~1
:waitmore
>nul ping -n 3 localhost
FOR %%A IN (%temp%\%guid%.list) DO set sizenow=%%~zA
if not "%sizeprev%"=="%sizenow%" (
set sizeprev=%sizenow%
goto waitmore
)
FOR /F %%A IN (%temp%\%guid%.lock) DO (
if not "%%A"=="%id%" goto :EOF
FOR /F "tokens=*" %%B IN (%temp%\%guid%.list) DO (
echo.FILE=%%B
)
del "%temp%\%guid%.list"
del "%temp%\%guid%.lock"
pause
)
虽然这很有效,但如果您在另一组文件上开始新操作之前没有等待第一组文件被解析,那么这将是一个可怕的可怕黑客并且会严重失败。
答案 2 :(得分:1)
它的工作方式似乎是由shell强加给你的,似乎没有一种简单的方法可以解决这个问题。
某些应用程序会添加自己的菜单项,该菜单项允许以不同的方式调用应用程序(即,仅对组进行一次调用),从一般情况下(对于每个选定项目重复执行),而另一个应用程序将使用API检查自己的状态,并将“打开”请求重定向到已经运行的副本。
批处理文件不适用于其中任何一种。您可能需要一个不同的工具。即使您希望批处理文件完成主要工作,您仍然需要一种方法来调用批处理文件来处理项目列表。
答案 3 :(得分:1)
晚会,但这是我的2美分。在尝试自定义“移动到Dropbox文件夹”的行为时遇到了同样的问题...'上下文菜单命令。我需要将选择的每个文件通过管道传输到批处理文件,以便在一个实例中处理处理。
经过一番挖掘后,我找到了Context Menu Launcher。
简单易用。我在singleinstance.exe
中弹出C:\Windows\system32
并创建并运行了类似于下面的.reg
文件。
Windows Registry Editor Version 5.00
; Documents
[HKEY_CLASSES_ROOT\SystemFileAssociations\document\Shell\Dropbox]
@="Move to Dropbox Folder"
"Icon"="%SystemRoot%//system32//imageres.dll,-112"
"MultiSelectModel"="Player"
[HKEY_CLASSES_ROOT\SystemFileAssociations\document\Shell\Dropbox\command]
@="singleinstance.exe \"%1\" \"C:\\Move to Dropbox Folder.bat\" $files --si-timeout 400"
答案 4 :(得分:0)
我猜你有一组突出显示的文件,你想为每个文件运行一些程序。
@echo off
for %%A in (%*) do echo %%A
pause