Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Запуск программы с параметром: точный путь неизвестен

#windows #bat #командная_строка


На клиентских ПК установлено некоторое ПО "ПРОГРАММА", "ПРОГРАММА" может иметь разные
версии, и, соответственно, установлено по разным путям. Есть файл, имеющий некое расширение
".XXX", это расширение ассоциировано с "ПРОГРАММА", т.е. при даблклике в проводнике
Windows по этому файлу открывается "ПРОГРАММА" с содержимым файла. При вводе в командной
строке пути к этому файлу также открывается "ПРОГРАММА". Здесь все нормально.

Теперь задача: нужно открыть определенный файл, имеющий расширение ".XXX" в "ПРОГРАММА",
но с дополнительным параметром (он известен).

Как это сделать средствами командной строки?

Если это невозможно, могу написать приложение (C#), которое будет брать где-то в
реестре путь к программе ассоциированной с расширением ".XXX" и запускать, но, при
условии, что это не потребует каких-то привилегий.

ОС: Windows 7 SP1



Пример для воспроизведения проблемы:

Имеется установленный Notepad++, он ассоциирован с текстовыми файлами с расширением
".TXT", также у него имеется параметр -ro для открытия файла в режиме только для чтения.
Путь до самого приложения неизвестен.

Если я в командной строке ввожу

"C:\Program Files\Notepad++\notepad++.exe" "C:\Users\User\Desktop\1.txt"


то файл открывается в нормальном режиме

Если ввожу:

"C:\Program Files\Notepad++\notepad++.exe" "C:\Users\User\Desktop\1.txt" -ro


то в режиме только для чтения.

Но путь "C:\Program Files\Notepad++\notepad++.exe" мне неизвестен, поэтому я открываю так:

"C:\Users\User\Desktop\1.txt"


файл открывается в обычном режиме

Если же ввожу:

"C:\Users\User\Desktop\1.txt" -ro


то файл все равно открывается в обычном режиме

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


Ответы

Ответ 1



static string AssocQueryString(AssocStr association, string extension) { const int S_OK = 0; const int S_FALSE = 1; uint length = 0; uint ret = AssocQueryString(AssocF.None, association, extension, null, null, ref length); if (ret != S_FALSE) { throw new InvalidOperationException("Could not determine associated string"); } var sb = new StringBuilder((int)length); // (length-1) will probably work too as the marshaller adds null termination ret = AssocQueryString(AssocF.None, association, extension, null, sb, ref length); if (ret != S_OK) { throw new InvalidOperationException("Could not determine associated string"); } return sb.ToString(); } Вызывать с AssocStr.ASSOCSTR_EXECUTABLE и ".txt". Пример кода взят из другого ответа на английском.

Ответ 2



В принципе установка ассоциации с типом файла позволяет выставить любой вызов который вам нужен. По умолчанию это выглядит как примерно как prog.exe "%1" где в %1 идёт имя файла по которому кликнули. Можно это поменять с помощью ftype и assoc: ftype MyProgramType=%ProgramFiles%\MyDir\MyProgram.exe "%1" /arg1 /arg2 assoc .xxx=MyProgramType при даблклике или вызове из командной строки тогда помимо имени файла будут переданы /arg1 /arg2

Ответ 3



В качестве возможной идеи, можно добавить ваше приложение в App Paths. При этом его можно будет запускать без полного пути и под альтернативным именем: n -ro text.txt Но если идти этим путём, можно и просто положить bat-файл с новым названием в доступном месте.

Ответ 4



Я когда-то решал задачу запуска Access-а, который мог быть установлен по разным путям. Брал путь установки из реестра. @echo off for /f "skip=1 tokens=2,*" %%i in ('reg query "HKLM\Software\Microsoft\Office\11.0\Access\InstallRoot" /v "Path"') do set PathToAccess="%%j" cd /d %PathToAccess%\ start msaccess.exe P:\Bank\CredStage\Orders_journal.mde /WRKGRP P:\Bank\CredStage\Security.mdw

Комментариев нет:

Отправить комментарий