Как получить ftype & assoc для соответствия с проводником Windows?


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 по умолчанию).


Ответы:


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. Я не пытался перезагрузиться, однако.



@ TheIncorrigible1 ссылка не работает :(
DaveInCaz

@DaveInCaz О, это действительно грустно. Я раздражен, что они сломали все ссылки на блог MSFT. Я посмотрю, смогу ли я восстановить его; надеюсь, у него просто появилась новая ссылка, и он не исчез (как в случае с некоторыми другими вещами)
TheIncorrigible1


5

я не знаю, как вы можете сделать соответствие между реестром и тем, что появляется в 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).


3

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

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

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

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


SetUserFTA очень полезен и может быть написан по сценарию.
DaveInCaz

1

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

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

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

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

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


Если я правильно понимаю, ключ .py\Applicationиспользуется для открытия файлов py. Я не понимаю, в каких случаях используется значение in Python.File.
Готье

Согласно Majenko, это зависит от погоды, данное расширение рассматривается Windows как исполняемый файл (см. PATHEXTПеременную). Однако я вспоминаю, как читал в прошлом, что сотрудники, созданные в Проводнике, всегда перезаписывают данные из Classesраздела реестра.
Петр Доброгост

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). Помимо значения по умолчанию или вместо него, для подраздела «OpenWithProgID» могут быть указаны дополнительные имена ProgID (например, 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, чтобы увидеть больше примеров.


HKCR не работает так, как вы думаете. В HKCR у меня есть запись "исходный код". «исходный код» не существует в HKLM \ Software \ Classes. С другой стороны, в HKCU \ Software \ Classes присутствует «исходный код». Итак, очевидно, что HKCR включает записи из HKCU \ Software \ Classes. С другой стороны, как в HKCR, так и в HKLM присутствуют «SoundRec» и «SPCFile». Но HKCU \ Software \ Classes не имеет их. Таким образом, HKCR также, очевидно, включает записи из HKLM. HKCR определенным образом объединяет две локации. Также см. Superuser.com/a/266274
Бен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.