Як змусити ftype & assoc відповідати Windows Explorer?


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, ви побачите, що запис Open With розширюється до підменю, в якому перераховані 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 марні. Що я роблю, щоб змінити програму за замовчуванням для даного розширення програмно (порівняно зі стандартним та більш простим способом за допомогою Explorer) - змінити цей ключ реєстру

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.

EDIT: Ця сторінка може вас зацікавити: 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. Я не розумію, в яких випадках використовується значення Python.File.
Готьє

За словами Маєнко, це залежить від погоди, яке розширення трактується Windows як виконуваний файл (див. PATHEXTЗмінну). Однак я пам'ятаю, як читали в минулому, що партнери, створені в Провіднику, завжди перезаписують їх із Classesключа реєстру.
Пьотр Доброгост

1

Ваша найбільша підказка щодо мети та місця розташування - у "великому типі", тобто назвах відповідних вуликів: HKLM та HKCU

Асоціації файлів встановлюються в обох вуликах і мають дві різні цілі:

Як випливає з назви, записи реєстру HKCU встановлюють файлові асоціації для ТЕКУЩОГО КОРИСТУВАЧА та змінюють відповідні налаштування типу файлу в HKLM.

HKLM встановлює асоціації файлів для МІСЦЕВОГО МАШИНУ, тобто для ВСІХ КОРИСТУВАЧІВ машини (якщо це не перекрито записами HKCU). (Для Win98 HKCR був лише короткочасним псевдонімом HKLM \ Software \ Classes. Вони не були окремими або різними вуликами. Однак це змінилося для Win XP і більше не відповідає дійсності. HKCR тепер віртуальний вулик, який є результатом злиття. клавіші HKLM \ Software \ Класи \, HKCU \ Software \ Класи \ та 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). Цей ключ містить підрозділи, щоб повідомити Windows, який значок використовувати та як відкрити, надрукувати, printto тощо, пов'язаний файл (наприклад, команда HKCR \ txtfile \ shell \ open \ команда). Аналогічно, кожне ім'я програми визначається як підрозділ під HKCR \ Applications (наприклад, HKEY_CLASSES_ROOT \ Applications \ Firefox.exe \ shell \ open \ command).

Окрім ключа HKCU \ Software \ Classes, асоціації файлів облікових записів користувачів знаходяться у ключі HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts. Ці записи не є лише для Провідника Windows, як було запропоновано, але є додатковим джерелом переопределення асоціацій файлів облікових записів користувачів. Записи створюються засобами асоціації файлів у провіднику (Провідник \ Інструменти \ Параметри папок \ Типи файлів) і містять OpenWithList та / або підрозділ OpenwithProgID для кожного перерахованого розширення файлу.

Для визначення асоціації файлів Windows спочатку розглядає записи HKCU для відповідного розширення файлу. Тільки якщо їх не знайдено, вступають у програму записи HKLM. (Примітка. Я не перевіряв, що має перевагу - HKCU \ Software \ Classes або HKCU \ MIcrosoft \ Windows \ CurrentVersion \ Explorer \ FileExts, але я підозрюю, що це буде ключ FileExts). Крім того, якщо згаданий ProgID або ім'я програми не знайдено в HKCU, записи HKLM шукаються. (Зауважте, що \ Applications \ записи - це лише довільне ім'я, хоча вони, як правило, ідентичні дійсному файлу на файлі 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 \ Класи таких немає. Таким чином, HKCR також очевидно включає записи з HKLM. HKCR певним чином об'єднує два місця. Також дивіться superuser.com/a/266274
Бен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.