Я изменил ассоциацию, используемую при запуске .py
файла через проводник Windows:
- Инструменты -> Папки -> Типы файлов.
- Затем перейдите к
.py
. - Измените ассоциацию на 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, которая затем запускает программу.