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