Как сделать так, чтобы ftype и assoc соответствовали Проводнику Windows?

Как сделать так, чтобы ftype и assoc соответствовали Проводнику Windows?

Я изменил ассоциацию, используемую при запуске .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 по умолчанию).

решение1

В зависимости от того, как вы называете файл, будет зависеть от того, какой глагол используется. Глагол, который вы используете, определяет, что Windows будет с ним делать. Стандартные глаголы — это Открыть, Редактировать, Печать, Воспроизвести и Предварительный просмотр. Однако можносоздайте свои собственные глаголы. Наиболее часто добавляемый глагол — этоОткрыть С семьей(включая OpenWithProgIDs), которые добавляют это небольшое контекстное подменю под "Открыть с помощью", чтобы предоставить вам возможные альтернативы. Если вы установите 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и связав его с Notepad, ни , assocни не ftypeвидит эту ассоциацию. Ассоциация определенно есть в HKCUи HKCR. Однако я не пробовал перезагружать.

решение2

Я не знаю, как можно сопоставить реестр и то, что отображается в 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

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

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

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

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

решение4

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

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

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

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

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

Связанный контент