2012-02-16 1 views
1

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

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

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

ответ

2

Этот вопрос является дубликатом. Он адресован здесь: How to pass in multiple file/folder paths via a right-click event (verb) to an executable?

и здесь: How to add new items to right-click event on Folders and Files in Windows?

и похож на этот вопрос без ответа на суперпользователя: Creating Context Menu Item For Multiple Files

В двух словах, когда вы выбираете 2 файлов, а затем выберите действие из контекстного меню («глагол» в языке оболочки Windows), окна всегда будут открывать 2 отдельных экземпляра, если у вашего приложения нет проверки, чтобы убедиться, что он уже запущен. Тогда трюк должен включать в ваше приложение (пакетный файл в моем случае) альтернативный метод для выполнения. Это может быть достигнуто как Factor Mystic и Remy Lebeau - TeamB оба указывают на использование Interprocess Communication (IPC), например Dynamic Data Exchange (DDE). Factor Mystic также перечисляет некоторые хорошие ссылки 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) из первого, как только у меня есть оба файла. Очевидно, что он имеет проблемы при вызове нечетных #s файлов, но, как я уже сказал, это быстро и грязно.

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

+0

+1 для ответа на свой вопрос, а затем следующий до поделиться ответом с остальными из нас! – technomalogical

0

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

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

+0

, предлагающий код/​​помощь частным образом, не так, как этот сайт должен работать - профиль - единственное место, где вы можете опубликовать свою контактную информацию :-) – kleopatra