Консультация № 171451
18.08.2009, 15:49
0.00 руб.
0 8 2
Здравствуйте! У меня вопрос по ассоциациям файлов. Я пользуюсь портативными программами и хочу автоматизировать ассоциацию, чтобы не настраивать каждый раз через свойства файла. Помогите написать bat-файл, чтобы нужный файл открывался программой, неважно в каком месте она будет находиться! Помню сталкивался с таким файлом, но не могу найти его код заново!
То есть, программа и батник лежат в одной папке, и путь до программы, по идее, должен быть переменной!
Заранее спасибо!

Обсуждение

давно
Мастер-Эксперт
259041
7464
20.08.2009, 06:34
общий
Antonmerkulov:
Здравствуйте, Антон.
"программа и батник лежат в одной папке" - как понимать? "батник" - это Ваш будущий Assoc.cmd, которым Вы хотите пере-назначать ассоциации. А "программа" - о чём Вы? О разных приложениях-открывачках, которые исторически расположены в разных папках? Вы хотите запускать Assoc.cmd из разных папок?
"путь до программы, по идее, должен быть переменной" - например? У Вас уже созданы свои системные переменные или Вы хотите редактировать их в ini-файле?
Неизвестный
20.08.2009, 22:26
общий
Алексеев Владимир:
Здравствуйте! Вы меня не совсем так поняли. Портативная программа, она же может запускаться из любого места и носителя, она к системе не привязана, поэтому на разных компьютерах путь к исполняемому файлу программы может быть разным. И не обязательно .cmd, можно просто .bat. Я как-то скачивал уже программу в которой был такой батник, который настраивал ассоциацию. Ведь, если программа портативная, то система о ней не знает и чем открыть файл, не знает.

Вот пример создания типа файла, как у меня это получилось:

[HKEY_CLASSES_ROOT\.XXX]
@="XXXfile"

[HKEY_CLASSES_ROOT\XXXfile]
@=""

[HKEY_CLASSES_ROOT\XXXfile\DefaultIcon]
@="П У Т Ь К И К О Н К Е"

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

[HKEY_CLASSES_ROOT\XXXfile\shell]

[HKEY_CLASSES_ROOT\XXXfile\shell\open]

[HKEY_CLASSES_ROOT\XXXfile\shell\open\command]
@=""П У Т Ь К П Р О Г Р А М М Е" "%1""

Поэтому я и говорю, что путь должен быть переменной. Но скорее всего я не прописал еще какие-то пути, раз программа не запускается, какие не знаю. Перезагрузку делал.


Неизвестный
21.08.2009, 03:02
общий
это ответ
Здравствуйте, Antonmerkulov.

Вот на примере текстового файла.
Программа для открытия и иконка лежат в том же каталоге, что и cmd-файл. При выполнении cmd-файла, текстовый файл сопостовляется с программой, лежащей в том же каталоге
Текст cmd-файла:

reg add "HKCR\.txt" /ve /t REG_SZ /d txtfile /f

reg add "HKCR\txtfile\DefaultIcon" /ve /t REG_SZ /d %~dp0\notepad.ico /f

reg add "HKCR\txtfile\shell\open\command" /ve /t REG_SZ /d "%~dp0\notepad.exe %%1" /f

Поясню, что к чему.
В первой строчке файлы с расширением .txt "сопостовляются" с типом файлов "txtfile". Во второй строчке присваивается иконка для таких файлов. В третьей строчке сопоставляется приложение для открытия по умолчанию (все это в принципе и так понятно).
Часть команды "reg add" - запуск утилиты для редактирования реестра из командной строки.
Далее идет ключ реестра (что очевидно).
Часть команды "/ve /t REG_SZ" - определяют параметр по умолчанию в ключе реестра, и его тип REG_SZ (может быть и REG_EXPAND_SZ, но тогда значение нужно задавать двоичным)
Ключ "/f" указывает записывать без запроса на перезапись
После ключа "/d" идет само значение параметра по умолчанию. Символы "%~dp0" и есть переменная, которая равна пути к папке, из которой запускается cmd-файл. Только обратите внимание, что в cmd-файле надо писать "%%1", тогда запишется в реестр "%1"

К примеру, если запустить команду:
reg add "HKCR\txtfile\shell\open\command" /ve /t REG_SZ /d "%~dp0\notepad.exe %%1" /f

из cmd-файла, расположенного в папке C:\notepad, то в реестре будет записано значение:
C:\notepad\notepad.exe %1

Конечно, для каждого приложения набор ключей открытия файла может быть свой
Неизвестный
21.08.2009, 13:59
общий
Antonmerkulov:
Хотелось бы дополнить свой ответ
Да, еще надо бы добавить откатный механизм, то есть перед внесением изменений, надо экспортировать имеющиеся значения в реестре, что бы их потом восстановить
Нужно добавить пару строк в cmd-шник в начало:

reg export HKCR\.txt backuptxt.reg

reg export HKCR\txtfile backuptxtfile.reg

Таким образом создадутся два рега backuptxt.reg и backuptxtfile.reg для восстановления значений, которые были до изменений
То есть весь вид батника:

reg export HKCR\.txt backuptxt.reg
reg export HKCR\txtfile backuptxtfile.reg
reg add "HKCR\.txt" /ve /t REG_SZ /d txtfile /f
reg add "HKCR\txtfile\DefaultIcon" /ve /t REG_SZ /d %~dp0\notepad.ico /f
reg add "HKCR\txtfile\shell\open\command" /ve /t REG_SZ /d "%~dp0\notepad.exe %%1" /f
давно
Мастер-Эксперт
259041
7464
21.08.2009, 18:55
общий
это ответ
Здравствуйте, Antonmerkulov.
bat-файл - это пережиток MsDOS, предлагавшей ограниченный набор команд из ком-процессора Command.com и несколько отдельных команд-файлов (FDISK.EXE, FORMAT.COM, SMARTDRV.EXE…). Основа современных cmd-файлов - командный процессор Cmd.exe, предлагающий намного более широкие возможности для программирования.
Благодаря Microsoft-политике совместимости программного обеспечения устаревшие bat-файлы могут работать и под новой ОС (ОперСистемой) WindowsXp, но во избежание двусмысленного толкования разумнее называть вещи своими именами.
Давайте напишем cmd-файл, связывающий файл-тип с расширением .xxx (из Вашего примера в мини-форуме) с какой-нибудь программой для открытия этого файла (например, текстовый редактор notepad.exe). Создадим текстовый файл 1.xxx и попыткой открыть его убедимся, что ОС "не знает" чем открывать этот тип. (Чтоб ОС "забыла" о нём, удалите раздел HKEY_CLASSES_ROOT\XxxFile ).
В первой строке нашего Assoc.cmd команда @Echo off запрещает отображать мешающие тексты командных слов в ниже-строках. Символ @ перед Echo скрывает отображение текста текущей, первой строки. Символ & позволяет употребить в одной строке несколько операторов, что делает текст большой программы удобо-читаемым (не растягивает на много экранов). После команды rem можно вписывать комментарии, поясняющие алгоритм.
Во второй строке программа объявляет Executing %0, что по-русски означает "Исполняется ВашПуть\Assoc.cmd". Это удобно при диагностике ошибок, связанных с текущим путём и не-нахождением в нём каких-либо файлов-помощников. Doskey `=Exit помогает творческим лентяям закрывать окно программы при стоп-отладке после паузы на заданном этапе. Вместо ввода команды Exit достаточно будет нажать клавишу Esc, независимую от текущей клав-раскладки, и нажать Enter.

Команда Echo. создаёт на экране пустую разделитель-строку перед очередным Вашим назначением.
Команда Assoc .xxx=XxxFile привязывает расширение .xxx к типу XxxFile , а команда
Ftype XxxFile=Notepad.exe %%1
задаёт программу-открывачку (Notepad.exe) для открытия типа XxxFile с открываемым файлом, заданным как параметр %%1 , который в процессе исполнения cmd-файла изменится на %1. После исполнения этой тройки команд создаётся раздел HKEY_CLASSES_ROOT\XxxFile\Shell\Open\Command с параметром @=Notepad.exe %1 , и станет возможным открывать файл 1.xxx даже без перезагрузки!
Но Вы не увидите этот раздел, если окно редактора реестра было открыто до исполнения Assoc.cmd (в Windows2000 этого "косяка" не было). В WindowsXp надо в окне редактора реестра нажать клавишу F5 для обновления экранного отображения с жёсткого диска.
Обратите внимание, что Notepad.exe задан без пути. Такое упрощение допустимо, поскольку его путь прописан в системной переменной Path (в моей ОС
PATH=D:\WINDOWS\system32;D:\WINDOWS;D:\WINDOWS\system32\WBEM;D:\Progra~1\WinRar
позволяет задавать даже кмд Rar.exe без пути). Если путь к Вашей "открывачке" не прописан в Path, то его надо задать полностью, а если путь содержит пробелы, то надо заключить его в кавычки. Пример синтакса: команда ftype Word.Document.8 (для .doc-файлов) возвращает:
Word.Document.8="D:\Program Files\Microsoft Office\Office10\WINWORD.EXE" /n /dde

Если Вам очень хочется назначить иконку или принт-дополнения к своему файл-типу, то команда Reg add может упаковать Ваши reg-строки из мини-форума как добавки в существующий Assoc.cmd.
Команда Echo Will assign icon (="предстоит назначение иконки") - комментирует очередное задание, поскольку ниже Reg-команда авто-отчитывается об успешности исполнения, не сообщая чем она занималась.
В команде Reg add Hkcr\XxxFile\DefaultIcon - имя создаваемого раздела, /ve - параметр @ , /d shimgvw.dll,2 - присваиваемое значение, /f =перезапись существующего значения без диалог-запроса.
Если Ваша иконка не прописана в системной dll или Path, то её также надо указать с полным путём, а при наличии пробелов заключить в кавычки.
Команда Pause задерживает отображение процесса исполнения на экране до нажатия любой клавиши.

Для ознакомления с синтаксом выше-перечисленных команд можно в окне командной строки (Пуск \Выполнить \Cmd) задать любую из них с ключём /?
reg add /?
Хороший "Справочник по параметрам командной строки" имеется в Центре справки и поддежки (клав-сочетание Windows+F1).
Семейство reg-команд исходно не исполняется в ОС Windows2000, но можно скопировать файл reg.exe из WindowsXp \WINDOWS\system32\ , и Windows2000 "удочеряет" его в своей \Winnt\system32\
Готовый Assoc.rar Вы можете скачать. Удачи Вам в автоматизации!
Неизвестный
22.08.2009, 15:18
общий
Kom906:
Большое спасибо за ответ! У меня все получилось! Особенно помогли с переменностью пути. Желаю удачи в вашей работе!
давно
Мастер-Эксперт
259041
7464
23.08.2009, 07:50
общий
Antonmerkulov:
Я, кажется, понял: В чужой комп Вы вставляете свой сменный носитель и хотите пуском своего .cmd ассоциировать заданное расширение с открывачкой, которая на этом же носителе в одной папке с
.cmd, верно? Тогда вместо неконкретного "путь до программы, по идее, должен быть переменной" Вам следовало запросить функцию, возвращающую значение пути %~dp0 из параметра %0 исполняемого файла.
Мне такое и в голову не приходило. Я если приношу юзерам хорошую открывачку, то сразу копирую им на Hdd или устанавливаю. Как хорошо, что Kom906 догадался что именно Вам требуется. Он даже предусмотрел механизм отката, чтоб Вы, покидая чужой комп, возвратили хозяину исходную ассоциацию.
Kom906 - удивидельно талантливый, скромный, доброжелательный и порядочный специалист!!
Неизвестный
23.08.2009, 16:12
общий
Алексеев Владимир:
Да, все именно так! Очень помог!
Форма ответа