#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
Комментариев нет:
Отправить комментарий