передать несколько файлов в один пакетный файл (используя выделение проводника) - PullRequest
2 голосов
/ 09 марта 2011

Я уже могу запустить командный файл, когда пользователь щелкает правой кнопкой мыши по типу файла. Как я могу сделать так, чтобы только один экземпляр работал на выделенную группу и получал все файлы в качестве аргументов. В настоящее время он запускает один экземпляр для каждого файла, когда пользователь «смещает клики»

есть, скорее всего, лучший способ сказать это ... вы можете понять, почему у меня возникли проблемы с поиском в Google.

спасибо

Ответы [ 5 ]

3 голосов
/ 10 марта 2011

Если вы создадите пакетный файл и разместите его на рабочем столе, то вы можете выбрать несколько файлов и поместить их в этот пакетный файл.Они будут переданы в файл как несколько параметров.

Например, предположим, что вы поставили 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.

3 голосов
/ 11 марта 2011

Обычно вызов множественного выбора ассоциации файлов запускает несколько экземпляров программы, и самой программе придется иметь дело с ней самостоятельно (или с помощью 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
)

Хотя это работает, это ужасно ужасный хак, и он будет плохо работать, если вы не дождетесь анализа первого набора файлов перед началом новой операции над другим набором файлов.

1 голос
/ 04 января 2017

Поздно на вечеринку, но вот мои 2 цента. У меня возникла та же проблема при попытке настроить поведение команды контекстного меню «Переместить в папку Dropbox ...». Мне нужно, чтобы каждый выбранный файл передавался в командный файл для обработки в одном случае.

После некоторых копаний я нашел Панель запуска контекстного меню .

Достаточно прост в использовании. Я набрал 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"
1 голос
/ 10 марта 2011

Кажется, что это работает навязанной вам оболочкой, и не существует простого способа решить эту проблему.

Некоторое приложение добавит свой собственный пункт меню, который позволитприложение будет вызываться иначе (т.е. только один раз для группы) по сравнению с тем, как оно выполняется в целом (неоднократно для каждого выбранного элемента), в то время как другое приложение будет использовать API для проверки своего присутствия и перенаправит запрос «open» на свойуже запущена копия.

Пакетные файлы не предназначены ни для одного из них.Вам, вероятно, понадобится другой инструмент.Даже если вы хотите, чтобы основная работа выполнялась пакетным файлом, вам все равно потребуется способ вызова пакетного файла для обработки списка элементов.

0 голосов
/ 23 мая 2013

Я предполагаю, что у вас есть группа выделенных файлов, и вы хотите запустить какую-то программу для каждого файла.

@echo off
for %%A in (%*) do echo %%A
pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...