передать два файла в действие типа файла Windows - PullRequest
1 голос
/ 16 февраля 2012

Используя Windows XP, я создал пакетный файл, который принимает два файла в качестве аргументов, и теперь я хочу добавить действие типа файла «сравнить» с определенными расширениями, например, «.txt», которое вызывает пакетный файл сдва выбранных файла.То есть я хочу выбрать два ".txt" файла, а затем выбрать "сравнить" из контекстного меню оболочки и заставить его выполнить пакетный файл с этими двумя файлами.

Я могу легко добавить "сравнить""действие для типа файла" Текстовый документ "и выберите пакетный файл с двумя аргументами, например," C: \ batch.bat ""% 1 ""% 2 "(кстати: это отлично работает из cmd и другихпрограммы, например Git difftool), но если я выберу 2 файла и попытаюсь сравнить их, Windows откроет два отдельных экземпляра для каждого из двух выбранных файлов вместо их сравнения.

Я проверил Google и SO, но не смогнайти любую ссылку о том, как получить файлы в качестве аргументов для передачи в действие типа файла.Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Этот вопрос является дубликатом. Это адресовано здесь: Как передать несколько путей к файлам / папкам с помощью события щелчка правой кнопкой мыши (глагол) в исполняемый файл?

и здесь: Как добавить новые элементы в событие щелчка правой кнопкой мыши на Папках и файлах в Windows?

и похож на этот оставшийся без ответа вопрос о суперпользователе: Создание пункта контекстного меню для нескольких файлов

В двух словах, когда вы выбираете 2 файла и затем выбираете действие из контекстного меню («глагол» на языке оболочки Windows), окна всегда будут открывать 2 отдельных экземпляра, если только ваше приложение не проверит, проверяет ли оно уже бежит. Хитрость заключается в том, чтобы включить в ваше приложение (в моем случае, командный файл) альтернативный метод для выполнения. Это может быть достигнуто, когда Фактор Мистик и Реми Лебо - TeamB оба указывают на использование Межпроцессное взаимодействие (IPC) , такое как Динамический обмен данными (DDE) . Фактор Мистик также перечисляет некоторые хорошие ссылки MSDN для этого. Также есть быстрый и грязный способ, предложенный низкоуровневым использованием SendTo.

Вот мой быстрый и грязный путь:

@ECHO off
SETLOCAL
IF NOT EXIST C:\file.tmp (
    ECHO %1 > C:\file.tmp
) ELSE (
    FOR /F "TOKENS=*" %%A IN (C:\file.tmp) DO (
        DEL C:\file.tmp
        C:\BATCH %1 %%A
    )
)
SETLOCAL

Это приложение, которое я использую для действия типа "глагол", и оно принимает только одну переменную. Я не использовал DDE, потому что я кеширую первый файл на диске. Затем вызовите реальное приложение (BATCH) из первого, как только у меня появятся оба файла. Очевидно, что возникают проблемы при вызове нечетного количества файлов, но, как я уже сказал, это быстро и грязно.

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

0 голосов
/ 13 июля 2013

То, что я делаю для каждого процесса, получало путь к файлу и сохранялось в другом файле, например, «Сообщество», затем проверял, существует ли файл флага, такой как «флаг», если нет, означает, что это первый процесскоторый проверяет флаг и является процессом, который будет выполнять всю функциональность, в этом случае этот процесс создает файл-флаг, чтобы указать другим процессам завершить себя, после этого живой процесс считывает все пути из файла"Сообщество".

Я надеюсь помочь вам, извините за мой английский ...

...