Я уже описывал задачу здесь, но видимо либо непонятно описание, либо нужные люди не успели прочитать пока сообщение было в топе.
В общем есть задача когда требуется выбрать несколько файлов в эксплорее/проводнике, нажать ПКМ, вменю выбрать пункт, например "Архивировать" и выбранные файлы/папки отправятся в архив. Проблема в том, что обычный пункт контекстного меню в такой ситуации запускает каждый элемент (папку файл) с исполняемым файлом, то есть архиватор запустился бы 5 раз для каждого отдельно взятого элемента. Такой проблемы нет для пункт "Отправить" (SendTo), то есть кидаем ярлык в "C:\Users\юзер\AppData\Roaming\Microsoft\Windows\SendTo" и выделенные файлы будут запущены не каждый самостоятельно, а все как параметры одной ком-строки, то есть батник возьмёт все файлы/папки и сожмёт их в один архив, а не по отдельности. То есть хочется как у 7zip есть своё меню и он именно захватывает все файлы, аналогично у Notepad++ регистрирует свою dll, которая также открывает в одном экземпляре программы, хотя можно было бы предположить, что прога при запуске проверяет что один экземпляр уже запущен и передаёт файл открытой программе, но подозреваю, что сделано именно сразу передача файлов программе, а не запуск Notepad++ многократно с последующим закрытием.
Ещё ссылка по теме
готовый комплект, скачать (благодаря рабочему решению Петра)
.
.
.
pkm_dll
Создаёт пункт меню в контекстном меню проводника.
Сформировать ini-файл, зарегистрировать dll, пользоваться.
[set] ; секция настроек
HotReadINI=0 ; предназначен для теста dll. При регистрации dll установить в 1, тогда каждый клик пункта меню сопровождается чтением ini-файла, что позволяет на лету менять параметры пункта (кроме NamePlag, Text и Bitmap). Когда пункт протестирован перейдите HotReadINI = 0 и горячее чтение прекратится. Чтобы начать тест заново надо перевести в 1 и сделать перелогин аккаунта.
Path=pkm.bat ; любой исполняемый файл, абсолютный путь, относительный от папки DLL и имя файла с поиском в %Path% или в папке DLL
Arg=/i ; дополнительные аргументы, кроме путей к выделенным файлам. Аргумент вставляется перед файлами.
ModeWorkDir=1 ; определяет рабочую папку. 0 - рабочая папка там где выбранные файлы, 1 - рабочая папка исполняемого файла
Text=My Item ; текст пункта, то что будет отображаться в меню. На любом языке, с пробелами.
Bitmap=1 ; если 1 то показывать значок пукнта. Это bmp-файл (icon.bmp), размером 16x16 пиксел в папке DLL. 0 - не отображать.
Select=1 ; что выбрать. 1 - файлы, 2 - папки, 3 - файлы и папки. Остальные будут игнорироваться.
Separator=| ; задаёт разделитель между файлами. Например в батнике можно задать разделитель в цикле, чтобы не использовать пробел, являющийся частью имени файла. Тогда %1 является вся строка с файлами.
Debug=0 ; режим отладки или вывода. 1, 2, 4, 8, 16. Итак, 1 и 4 выдают сообщение, причём 4 выдаёт только имена, а 1 исполняемый файл и рабочий каталог, 2 и 8 - буфер обмена, но 8 выдаёт только имена, а 2 исполняемый файл и рабочий каталог. Причём если в сообщении нажать ОК, то выполнится команда, получается контроль файлов и согласие выполнения, а вариант с буфером обмена не запускает исполняемый файл поэтому этот вариант можно использовать чтобы получить имена в буфер обмена для использования списка файлов на форуме и т.д. 16 - при 1 и 2 создаёт список файлов без путей. 1 и 2 выдаёт многострочный список вне зависимости от разделителя и кавычек.
Quotes=" ; задаёт символ вокруг строки файлов, чтобы bat-файл воспринимал строку как 1 параметр, не разделяя на пробелы. Но иногда нужен вывод без них.[dllreg] ; секция регистрации DLL
NamePlag=MyPlag1 ; внутреннее имя плага, не особо важно, но если DLL регистрируется более одного раза, то имя плага всегда должно быть другое, иначе это перезапишет секцию в реестре. Использовать латинские буквы и цифры без пробелов.
WhereAssoc=1 ; где регистрировать пункт: 1 - файлы, 2 - папки, 4 - диски. Сумма флагов даёт комбинации вариантов, например 1+2+4 = 7, то есть флаг 7 регистрирует пункт во всех.ini-файл читается только при регистрации и входе в аккаунт (при старте ОС). Это значит, что если необходимо поменять параметры в ini-файле, например пункт меню или исполняемый файл, или иконку (но не имя плагина), то это применится только после перезапуска эксплорера, аналогично после Выход -> Вход в аккаунт или перезагрузки. Но для теста введён параметр HotReadINI = 0, если HotReadINI = 1, то чтение ini-файла производится при каждом клике на пункте, это режим тестирования пункта без необходимости каждый раз делать перевыход, чтобы протестировать рабочую папку (ModeWorkDir), параметры запуска (Arg). После завершения теста переключить в HotReadINI = 0. начать тест снова горячим переключением в HotReadINI = 1 не получится, надо делать перелогин.
Bitmap не имеет прозрачных пикселов (хотя не тестировал розовую маску), поэтому весь квадрат значка должен быть заполнен, чтобы в белой и чёрной теме это выглядело одинаково.
Положить папку с dll например в системную папку. Для начала путь к dll без пробела для надёжности.
Указать параметры в ini-файле, подробнее см. выше.
Зарегистрировать dll с правами админа (zRegister_DLL.cmd). (чтобы перерегистрировать нужно выполнить zUnregister_DLL.cmd, сделать выход из аккаунта, чтобы подменить dll новой версией и снова зарегистрировать).
Выделить несколько файлов, нажать правую кнопку мыши, вызвать пункт меню.
Выполняется файл, указанный в "Path = "
Файлы передаются исполняемому файлу в виде ком-строки.
Повторить выше описанное, чтобы создать сколько угодно пунктов. Создать новую папку с копией dll с новыми параметрами ini-файла с созданием нового пункта меню.
Добавлен параметр Quotes = " - задаёт символ вокруг строки файлов
Добавлен параметр Debug = 0 включает отладку или режим вывода.
Добавлен параметр Separator = | задаёт разделитель между файлами
Добавлен параметр Select = 3 определяет файлы или папки захватывать
Добавлен параметр WhereAssoc = 3 определяет для каких объектов будет прописан пункт меню (диски, папки, файлы)
Добавлен параметр ModeWorkDir в ini-файл, определяющий рабочую папку 0 - папка выбранных файлов, 1 - папка исполняемого файла
Отредактировано AZJIO (13.09.2022 15:25:44)