Jak uzyskać ftype i assoc pasujące do Eksploratora Windows?

20

Zmieniłem skojarzenie, które ma być używane podczas uruchamiania .pypliku za pomocą Eksploratora Windows:

  1. Narzędzia -> Foldery -> Typy plików.
  2. Następnie przejdź do .py.
  3. Zmień powiązanie na Wordpad.

Teraz, gdy wpisuję nazwę pliku py w wierszu poleceń, Wordpad otwiera go.

Ale associ ftypew wierszu poleceń jeszcze powrócić, co następuje:

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

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

Jak to działa stowarzyszenie, ale associ ftypenie są tego świadomi?

Ponownie uruchomiłem monit.


Więcej informacji z mojego rejestru:

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

Więcej rejestrów:

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

Przypuszczam, że właśnie w tym się pojawia ftype Python.File. Ale nie wydaje się, aby się przyzwyczaić.


(Robię to w celu przetestowania, więc w końcu mogę łatwo wybrać moją domyślną wersję Pythona).

Gauthier
źródło

Odpowiedzi:

9

W zależności od tego, jak wywołasz plik, zależy to od użytego czasownika. Użyty czasownik określa, co Windows z nim zrobi. Standardowe czasowniki to Otwórz, Edytuj, Drukuj, Odtwórz i Podgląd. Możliwe jest jednak tworzenie własnych czasowników . Najczęściej dodawanym czasownikiem jest rodzina Open With (w tym OpenWithProgID), która dodaje to małe podmenu kontekstowe pod „Open With”, aby dać ci możliwe alternatywy. Jeśli na przykład zainstalujesz Paint.NET, a następnie klikniesz prawym przyciskiem myszy plik .jpg, zobaczysz, że pozycja Otwórz za pomocą rozwija się do podmenu zawierającego listę Paint.NET, Paint i wszelkie inne programy, które Microsoft nazwał przeglądarką zdjęć dla twojej wersji systemu Windows.

Ponadto bardzo ważne jest to, co powiedział Unsigned Code Labs. Podczas debugowania klas musisz spojrzeć na HKLM\Software\Classes\i HKCU\Software\Classes. HKCRjest bardzo przydatny do wysyłania zapytań do systemu, ale nie jest tak dobry, aby dowiedzieć się, dlaczego źle się zachowuje.

Zrobiłem trochę testów na moim systemie Windows 7 procmon.exe, a polecenia associ ftypewydają się próbować pisać bezpośrednio do HKCR, a system najwyraźniej interpretuje to jako pisanie na HKLM. Moje obecne konto jest członkiem grupy administracyjnej, ale UAC jest włączony. Odmówiono dostępu, gdy próbowałem assoc .mytest=MyTest.File.

Dziwne, że jeśli utworzę powiązanie, klikając prawym przyciskiem myszy plik o nazwie test.mytesti skojarząc go z Notatnikiem, to powiązanie assocnie będzie ftypewidoczne. Stowarzyszenie jest zdecydowanie tam HKCUi HKCR. Jednak nie próbowałem restartu.

Kawałki bekonu
źródło
@ TheIncorriable1 link is dead :(
DaveInCaz
@DaveInCaz Och, to naprawdę smutne. Jestem zirytowany, że złamali wszystkie linki do blogów MSFT. Zobaczę, czy mogę to przywrócić; mam nadzieję, że po prostu ma nowy link i nie zniknął (jak w przypadku niektórych innych rzeczy)
TheIncorrabled1
5

nie wiem jak możesz dopasować rejestr do tego, co pojawia się w ftype i assoc. Dla mnie i, jak widzę, również polecenie ftype i assoc są bezużyteczne. Aby zmienić domyślny program dla danego rozszerzenia w sposób programowy (w porównaniu ze standardowym i prostszym sposobem przy użyciu Eksploratora), zmodyfikuj ten klucz rejestru

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

Na przykład, jeśli chcę otworzyć moje pliki mp3 za pomocą mplayera, włączam

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

wartość „mplayerc.mp3”

Na czym polega komplikacja: najpierw musisz znać poprawne identyfikatory ProgID (użyj ftype), a po drugie potrzebujesz dostępu do zapisu w tym ulu. System Windows automatycznie umieszcza odmowę ACL dla klucza UserChoice, więc musisz znaleźć sposób na usunięcie tej reguły odmowy, aby uzyskać dostęp do zapisu. Korzystam z programu subinacl, który można pobrać stąd http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en w celu modyfikacji uprawnień. Możesz także skorzystać z zewnętrznego programu SetACL. Polecam pierwszy, ponieważ składnia jest o wiele prostsza.

mjsr
źródło
3

Eksplorator (powłoka systemu Windows) zawsze daje pierwszeństwo aplikacji określonej w kluczu dostawcy określonym w domyślnej wartości rozszerzenia. (W twoim przypadku .pyjest to rozszerzenie, Python.Fileto klucz dostawcy).

ftypei assocmogą odczytać ich wartości z innych dziedzin, nie wiem na pewno. Tak właśnie robi Explorer.

EDYCJA: Ta strona może Cię zainteresować: MSDN - Typy plików

Szczególnie to:

Poddrzewo HKEY_CLASSES_ROOT to widok utworzony przez połączenie HKEY_CURRENT_USER \ Software \ Classes i HKEY_LOCAL_MACHINE \ Software \ Classes.

Być może właśnie tutaj zderzają się różne części systemu Windows, jeśli w HKEY_LOCAL_MACHINE istnieje „domyślne” skojarzenie, które jest zastępowane przez zdefiniowane na koncie (które byłoby wówczas przechowywane w HKEY_CURRENT_USER).


źródło
3

Microsoft zmienił sposób, w jaki działa to od wersji Windows 8. Edycja rejestru, aby to zmienić, nie jest już możliwa. Aby zacytować Microsoft :

W wersji Pre-Win 8 aplikacje mogły ustawić domyślną procedurę obsługi typu pliku / protokołu poprzez manipulowanie rejestrem, co oznacza, że ​​możesz łatwo mieć skrypt lub zasady grupy manipulujące rejestrem. Jednak w Win 8 zmiany rejestru są weryfikowane przez skrót (unikalny dla użytkownika i aplikacji), który wykrywa manipulację przez aplikacje. W przypadku braku poprawnego skrótu ignorujemy wartość domyślną w rejestrze.

Sposób, w jaki Microsoft oczekuje, że zmienisz to teraz, to plik xml, który jest implementowany za pomocą zasad grupy. Instrukcje tutaj .

Na szczęście Christoph Kolbicz zmodyfikował algorytm mieszania i stworzył narzędzie o nazwie SetUserFTA, aby ustawić skojarzenie typu pliku. Niestety jest to zamknięte źródło.

pholcroft
źródło
SetUserFTA jest bardzo przydatny i może być skryptowany.
DaveInCaz
1

Pomyłka dotyczy tego, co jest używane do otwarcia pliku, a tym, co służy do uruchomienia pliku. Klucz rejestru

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

mówi systemowi Windows, jak otworzyć plik. Dwukrotne kliknięcie pliku otworzy plik w tej aplikacji.

Ponieważ plik nie jest plikiem wykonywalnym, wiersz polecenia zakłada, że ​​chcesz otworzyć plik za pomocą domyślnej aplikacji, tak jakbyś dwukrotnie go kliknął.

Zmiana powiązania z powrotem na C: \ Program \ Python27 \ python.exe lub edycja klucza rejestru, aby wskazywał na python, powinien powrócić do poprzedniego stanu, w którym Windows zakłada, że ​​chcesz otworzyć plik za pomocą domyślnego programu, którym jest python.exe, który następnie uruchamia program.

Majenko
źródło
Jeśli dobrze rozumiem, klucz .py\Applicationsłuży do otwierania plików py. Nie rozumiem, w jakich przypadkach Python.Fileużywana jest wartość .
Gauthier
Według Majenko zależy to od pogody, ponieważ dane rozszerzenie jest traktowane przez Windows jak plik wykonywalny (patrz PATHEXTzmienna). Pamiętam jednak, jak czytałem w przeszłości, że skojarzenia wykonane z Eksploratora zawsze nadpisują te z Classesklucza rejestru.
Piotr Dobrogost
1

Najważniejszą wskazówką dotyczącą celu i lokalizacji jest „duży typ”, tzn. Nazwy odpowiednich uli: HKLM i HKCU

Powiązania plików są ustawione w obu ulach i mają dwa różne cele:

Jak sama nazwa wskazuje, wpisy rejestru HKCU ustawiają powiązania plików dla BIEŻĄCEGO UŻYTKOWNIKA i zastępują odpowiednie ustawienia typu pliku w HKLM.

HKLM ustawia skojarzenia plików dla LOCAL MACHINE, tj. Dla WSZYSTKICH UŻYTKOWNIKÓW maszyny (chyba że zostaną zastąpione wpisami HKCU). (Dla Win98 HKCR był tylko skrótem dla HKLM \ Software \ Classes. Nie były to oddzielne lub różne ule. Jednak zmieniło się to dla Win XP i nie jest już prawdą. HKCR jest teraz wirtualnym ulem, który jest wynikiem połączenia klucze HKLM \ Software \ Classes \, HKCU \ Software \ Classes \ oraz HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts z pierwszeństwem informacji HKCU.)

Ten dwustopniowy system ułatwia nie tylko schematy asocjacji plików jeden do jednego, ale także wiele do jednego i jeden do wielu. Na przykład typy plików .htm, .html i .shtml można ustawić na ProgID = plik html, co z kolei może definiować pojedynczą przeglądarkę. OTOH, wpisy mogą zawierać podklucz OpenWithList lub OpenWithProgID z wieloma wpisami, aby otworzyć plik z listy wielu przeglądarek, edytorów lub innych aplikacji.

Zarówno HKLM \ Software \ Classes \, jak i HKCU \ Software \ Classes działają w ten sam sposób (jeden ma pierwszeństwo przed drugim). W najprostszej postaci istnieje klucz rejestru dla rozszerzenia pliku (np. HKCR.txt), którego wartością domyślną jest odpowiedni ProgID (np. Plik txt). Oprócz lub zamiast wartości domyślnej mogą być wymienione dodatkowe nazwy ProgID dla podklucza „OpenWithProgID” (np. Txtfile i htmlfile) i / lub dodatkowe nazwy aplikacji pojawiające się jako podklucze w „OpenWithList” (np. Notepad ++ .exe, Opera.exe, Firefox.exe).

Każdy ProgID jest zdefiniowany w innym kluczu w HKCR (np. HKCR \ txtfile). Ten klucz zawiera podklucze, które informują system Windows, której ikony użyć i jak otworzyć, wydrukować, wydrukować itp. Skojarzony plik (np. G, HKCR \ txtfile \ shell \ open \ polecenie). Podobnie każda nazwa aplikacji jest zdefiniowana jako podklucz w HKCR \ Applications (np. HKEY_CLASSES_ROOT \ Applications \ Firefox.exe \ shell \ open \ command).

Oprócz klucza HKCU \ Software \ Classes skojarzenia plików kont użytkowników znajdują się w kluczu HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts. Te wpisy nie dotyczą tylko Eksploratora Windows, jak sugerowano, ale stanowią dodatkowe źródło nadpisań powiązań plików kont użytkowników. Wpisy tworzone są za pomocą narzędzi do łączenia plików w eksploratorze (Explorer \ Tools \ Folder Options \ Typy plików) i zawierają podklucz OpenWithList i / lub OpenwithProgID dla każdego wymienionego rozszerzenia pliku.

Aby ustalić powiązanie pliku, system Windows najpierw sprawdza wpisy HKCU w poszukiwaniu odpowiedniego rozszerzenia pliku. Tylko jeśli nie zostanie znaleziony, wpisy HKLM wchodzą do gry. (Uwaga: nie testowałem, który ma pierwszeństwo - HKCU \ Software \ Classes lub HKCU \ MIcrosoft \ Windows \ CurrentVersion \ Explorer \ FileExts, ale podejrzewam, że będzie to klucz FileExts). Podobnie, jeśli w HKCU nie znaleziono odnośnika ProgID lub nazwy aplikacji, wyszukiwane są wpisy HKLM. (Zauważ, że wpisy \ Aplikacje \ są po prostu dowolną nazwą - mimo że zazwyczaj są identyczne z rzeczywistą nazwą pliku exe na dysku).

Aby zdefiniować powiązanie pliku dla określonego konta użytkownika, utwórz wpisy w gałęzi HKCU. Aby zdefiniować powiązanie dla wszystkich użytkowników, utwórz wpisy w gałęzi HKLM (HKCR) i usuń wszystkie odwołania w gałęzi HKCU do tego typu pliku. Oczywiście potrzebujesz odpowiednich praw dostępu do kluczy rejestru.

Nie używam narzędzi assoc i ftype, ponieważ wolę używać RegEdit w trybie interaktywnym lub wsadowym, ale z innych komentarzy wynika, że ​​działają one tylko w gałęzi HKLM i są bezużyteczne do czyszczenia / ustawiania kluczy HKCU. Poświęć trochę czasu i przejrzyj wyżej wymienione klucze za pomocą RegEdit, aby zobaczyć więcej przykładów.

ArtKns
źródło
HKCR nie działa tak, jak myślisz. W HKCR mam wpis „kod źródłowy”. „kod źródłowy” nie istnieje w HKLM \ Software \ Classes. Z drugiej strony w HKCU \ Software \ Classes obecny jest „kod źródłowy”. Więc oczywiście HKCR zawiera wpisy z HKCU \ Software \ Classes. Z drugiej strony zarówno w HKCR, jak i HKLM obecne są „SoundRec” i „SPCFile”. Ale HKCU \ Software \ Classes ich nie ma. Zatem HKCR oczywiście obejmuje również wpisy z HKLM. HKCR zdecydowanie w pewien sposób łączy te dwie lokalizacje. Zobacz także superuser.com/a/266274
Ben