20

Я изменил ассоциацию для использования при запуске файла .py через проводник Windows:

  1. Сервис -> Папки -> Типы файлов.
  2. Затем перейдите к .py .
  3. Измените ассоциацию на Wordpad.

Теперь, когда я набираю имя py-файла в командной строке, Wordpad открывает его.

Но assoc и ftype в командной строке по-прежнему возвращают следующее:

C:\> assoc .py
.py = Python.File

C:\> ftype Python.File
Python.File = "C:\Program\Python27\python.exe" "%1" %*

Почему ассоциация работает, но assoc и ftype не знают об этом?

Я перезапустил подсказку.


Больше информации из моего реестра:

HKEY_CLASSES_ROOT\.py
= Python.File

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
= wordpad.exe

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\OpenWithProgids\Python.File
= 

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.py\(Standard)
= Python.File

Больше реестра:

HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command\(Standard)
= "C:\Program\Python27\python.exe" "%1" %*`

Я полагаю, это то, что появляется в ftype Python.File Но, похоже, не привыкать.


(Я делаю это для тестирования, так что в итоге я могу легко выбрать версию Python по умолчанию).

6 ответов6

9

В зависимости от того, как вы называете файл, будет зависеть, какой глагол используется. Глагол, который вы используете, определяет, что Windows будет делать с ним. Стандартные глаголы:"Открыть", "Редактировать", "Распечатать", "Воспроизвести" и "Предварительный просмотр". Тем не менее, можно создавать свои собственные глаголы. Наиболее часто добавляемый глагол - это семейство Open With (включая OpenWithProgIDs), которое добавляет небольшое контекстное подменю в "Open With", чтобы дать вам возможные альтернативы. Например, если вы установите Paint.NET, а затем щелкните правой кнопкой мыши файл .jpg, вы увидите, что запись "Открыть с помощью" развернется в подменю, в котором перечислены Paint.NET, Paint и все, что Microsoft назвала средством просмотра изображений для вашей версии Windows.

Кроме того, очень важно то, что сказано в Unsigned Code Labs. Когда вы отлаживаете классы, вам нужно посмотреть на HKLM\Software\Classes\ и HKCU\Software\Classes . HKCR очень полезен для запросов к системе, но не так хорош, чтобы выяснить, почему он плохо себя ведет.

Я провел небольшое тестирование в своей системе Windows 7 с помощью procmon.exe , и команды assoc и ftype видимому, пытаются записать напрямую в HKCR , и система явно интерпретирует это как запись в HKLM . Моя текущая учетная запись является членом группы администраторов, но UAC включен. Мне было отказано в доступе, когда я попытался assoc .mytest=MyTest.File .

Как ни странно, если бы я создать ассоциацию , щелкнув правой кнопкой мыши файл с именем test.mytest и связывая его с помощью блокнота, ни assoc , ни ftype видит эту ассоциацию. Ассоциация определенно есть в HKCU и HKCR . Однако я не пробовал перезагрузиться.

4

я не знаю, как вы можете сделать соответствие между реестром и тем, что появляется в ftype и assoc. Для меня и, как я вижу, команды ftype и assoc бесполезны. Что я делаю, чтобы изменить программу по умолчанию для данного расширения программным способом (по сравнению со стандартным и более простым способом с помощью проводника), изменив этот раздел реестра

HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TheExtensionYouWantToModify\UserChoice\ProgID

Например, если я хочу открыть свои mp3-файлы с помощью mplayer, я добавлю

HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice\ProgID 

значение "mplayerc.mp3"

Что усложняет это: во-первых, вам нужно знать действительные ProgID (используйте ftype), а во-вторых, вам нужен доступ для записи в этот улей. Windows автоматически добавляет запрещающий ACL для ключа UserChoice, поэтому вам нужно найти способ удалить это запрещающее правило, чтобы получить доступ на запись. Я использую программу subinacl, которую вы можете загрузить здесь http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en, чтобы изменить разрешения. Также вы можете использовать стороннюю программу SetACL. Я рекомендую первое, потому что синтаксис намного проще.

3

Проводник (оболочка Windows) всегда отдает предпочтение приложению, указанному в ключе поставщика, который указан в значении расширения по умолчанию. (В вашем случае .py это расширение, Python.File является ключом поставщика.)

ftype и assoc могут читать их значения из других областей, я точно не знаю. Вот как это делает Explorer.

РЕДАКТИРОВАТЬ: Эта страница может быть интересна для вас: MSDN - Типы файлов

Особенно это:

Поддерево HKEY_CLASSES_ROOT - это представление, сформированное путем слияния HKEY_CURRENT_USER\Software\Classes и HKEY_LOCAL_MACHINE\Software\Classes.

Возможно, именно здесь различные части Windows сталкиваются, если в HKEY_LOCAL_MACHINE существует ассоциация "по умолчанию", которая переопределяется той, которую вы определили для своей учетной записи (которая затем будет сохранена в HKEY_CURRENT_USER).

1

Ваш самый большой ключ к назначению и местоположению находится в "большом типе", то есть названиях соответствующих ульев: HKLM и HKCU

Файловые ассоциации установлены в обоих кустах и имеют две разные цели:

Как следует из названия, записи реестра HKCU устанавливают ассоциации файлов для CURRENT USER и переопределяют соответствующие настройки типа файла в HKLM.

HKLM устанавливает ассоциации файлов для ЛОКАЛЬНОЙ МАШИНЫ, т. Е. Для ВСЕХ ПОЛЬЗОВАТЕЛЕЙ машины (если не переопределено записями HKCU). (Для Win98 HKCR был просто сокращенным псевдонимом для HKLM\Software\Classes. Они не были отдельными или разными ульями. Однако это изменилось для Win XP и больше не соответствует действительности. HKCR теперь является виртуальным кустом, который является результатом объединения ключей HKLM\Software\Classes\, HKCU\Software\Classes\ и HKCU\Software\ Microsoft\ Windows\ CurrentVersion\ Explorer\ FileExts с информацией HKCU, имеющей приоритет.)

Эта двухэтапная система упрощает схемы сопоставления файлов не только один-к-одному, но и многие-к-одному и один-ко-многим. Например, для типов файлов .htm, .html и .shtml может быть задано значение ProgID = htmlfile, которое, в свою очередь, может определять один браузер. OTOH, записи могут содержать подразделы OpenWithList или OpenWithProgID с несколькими записями для открытия файла из списка нескольких браузеров, редакторов или других приложений.

И HKLM\Software\Classes\, и HKCU\Software\Classes работают одинаково (один имеет приоритет над другим). В простейшей форме есть раздел реестра для расширения файла (например, HKCR.txt), значением по умолчанию которого является соответствующий ProgID (например, txtfile). В дополнение или вместо значения по умолчанию могут быть дополнительные имена ProgID, перечисленные для подраздела "OpenWithProgID" (например, txtfile и htmlfile), и / или дополнительные имена приложений, отображаемые в качестве подразделов в "OpenWithList" (например, Notepad++) .exe, Opera.exe, Firefox.exe).

Каждый ProgID определен в другом ключе в HKCR (например, HKCR\txtfile). Этот ключ содержит подразделы, чтобы указать окнам, какой значок использовать и как открыть, распечатать, распечатать и т.д. Связанный файл (например, g, HKCR\txtfile\shell\open\command). Точно так же каждое имя приложения определяется как подраздел в разделе HKCR\Applications (например, HKEY_CLASSES_ROOT\Applications\Firefox.exe\shell\open\command).

В дополнение к ключу HKCU\Software\Classes сопоставления файлов учетных записей пользователей находятся в ключе HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts. Эти записи предназначены не только для Windows Explorer, как было предложено, но являются дополнительным источником переопределений ассоциации файлов учетных записей пользователей. Записи создаются инструментами сопоставления файлов в проводнике (Explorer \ Tools \ Folder Options \ File Types) и содержат OpenWithList и / или подраздел OpenwithProgID для каждого указанного расширения файла.

Чтобы определить сопоставление файлов, Windows сначала просматривает записи HKCU для соответствующего расширения файла. Только если один не найден, вступают в игру записи HKLM. (Примечание: я не проверял, который имеет приоритет - HKCU\Software\Classes или HKCU\MIcrosoft\Windows\CurrentVersion\Explorer\FileExts, но я подозреваю, что это будет ключ FileExts). Аналогично, если в HKCU не найден ссылочный ProgID или имя приложения, выполняется поиск записей HKLM. (Обратите внимание, что \Applications \ entry - это просто произвольное имя - даже если они, как правило, идентичны действительному имени файла на диске exe.)

Поэтому, чтобы определить сопоставление файлов для конкретной учетной записи пользователя, создайте записи в кусте HKCU. Чтобы определить связь для всех пользователей, создайте записи в кусте HKLM (HKCR) и удалите все ссылки в кусте HKCU для этого типа файлов. Очевидно, вам нужны соответствующие права доступа к ключам реестра.

Я не использую инструменты assoc и ftype, поскольку предпочитаю использовать RegEdit в интерактивном или пакетном режиме, но из других комментариев видно, что они работают только с кустом HKLM и бесполезны для очистки / установки ключей HKCU. Потратьте некоторое время и просмотрите вышеупомянутые ключи с помощью RegEdit, чтобы увидеть больше примеров.

1

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

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
\.py\Application

это то, что говорит Windows, как открыть файл. Двойной щелчок по файлу откроет файл с этим приложением.

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

Если изменить ассоциацию обратно на C:\Program\Python27\python.exe или отредактировать раздел реестра, чтобы он указывал на python, он должен вернуться к тому, что был раньше, где Windows предполагает, что вы хотите открыть файл с программой по умолчанию, которая python.exe, который затем запускает программу.

1

Microsoft изменила, как это работает, начиная с Windows 8. Больше невозможно редактировать реестр, чтобы изменить это. Чтобы процитировать Microsoft:

В Pre-Win 8 приложения могли устанавливать обработчик по умолчанию для типа файла / протокола, манипулируя реестром, это означает, что вы могли легко иметь сценарий или групповую политику, управляющую реестром. Однако в Win 8 изменения реестра проверяются хешем (уникальным для каждого пользователя и приложения), который обнаруживает подделку приложений. При отсутствии действительного хэша мы игнорируем значение по умолчанию в реестре.

Microsoft ожидает, что вы измените это сейчас, с помощью XML-файла, который реализуется через групповую политику. Инструкции здесь.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .