Bagaimana cara saya mendapatkan ftype & assoc agar sesuai dengan Windows Explorer?

20

Saya mengubah asosiasi untuk digunakan setelah meluncurkan .pyfile, melalui Windows Explorer:

  1. Alat -> Folder -> Jenis file.
  2. Kemudian telusuri ke .py.
  3. Ubah asosiasi ke Wordpad.

Sekarang ketika saya mengetik nama file py di baris perintah, Wordpad membukanya.

Tetapi assocdan ftypedi baris perintah masih mengembalikan yang berikut:

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

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

Kenapa asosiasi itu bekerja, tetapi assocdan ftypetidak menyadarinya?

Saya memang me-restart prompt.


Info lebih lanjut dari registri saya:

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

Lebih banyak registry:

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

Saya kira inilah yang muncul ftype Python.File. Tapi sepertinya tidak terbiasa.


(Saya melakukan ini untuk pengujian, jadi saya akhirnya dapat memilih versi default Python saya dengan mudah).

Gauthier
sumber

Jawaban:

9

Tergantung pada bagaimana Anda memanggil file akan tergantung pada kata kerja apa yang digunakan. Kata kerja yang Anda gunakan menentukan apa yang akan dilakukan Windows dengan itu. Kata kerja standarnya adalah Open, Edit, Print, Play, dan Preview. Namun, dimungkinkan untuk membuat kata kerja Anda sendiri . Kata kerja yang paling umum ditambahkan adalah keluarga Open With (termasuk OpenWithProgIDs), yang menambahkan sub-menu konteks kecil di bawah "Open With" untuk memberikan Anda kemungkinan alternatif. Jika Anda menginstal Paint.NET, misalnya, dan kemudian klik kanan file .jpg, Anda akan melihat entri Open With memperluas ke submenu yang mencantumkan Paint.NET, Paint, dan apa pun yang disebut Microsoft penampil gambar untuk versi Anda. Windows.

Selain itu, apa yang dikatakan Laboratorium Kode Tanpa Tanda sangat penting. Saat Anda debug kelas, Anda perlu melihat HKLM\Software\Classes\dan HKCU\Software\Classes. HKCRsangat berguna untuk menanyakan sistem, tetapi tidak begitu baik untuk mencari tahu mengapa itu terjadi kesalahan.

Saya melakukan sedikit pengujian pada sistem Windows 7 saya dengan procmon.exe, dan perintah assocdan ftypetampaknya mencoba menulis langsung ke HKCR, dan sistem tampaknya menafsirkan itu sebagai menulis HKLM. Akun saya saat ini adalah anggota grup admin, tetapi UAC diaktifkan. Saya mendapat akses ditolak ketika saya mencoba assoc .mytest=MyTest.File.

Anehnya, jika saya membuat asosiasi dengan mengklik kanan file yang dipanggil test.mytestdan menghubungkannya dengan Notepad, tidak assocjuga ftypemelihat asosiasi ini. Asosiasi pasti ada di sana HKCUdan HKCR. Saya belum mencoba me-reboot.

Bit Bacon
sumber
Untuk pembaca masa depan
TheIncorrigible1
@Tautan TheIncorrigible1 sudah mati :(
DaveInCaz
@DaveInCaz Oh itu benar-benar menyedihkan. Saya kesal mereka merusak semua tautan blog MSFT. Saya akan melihat apakah saya dapat mengembalikannya; semoga itu hanya memiliki tautan baru dan tidak hilang (seperti halnya untuk beberapa hal lain)
TheIncorrigible1
@DaveInCaz Sangat populer, beberapa blog lain memposting ulang 😀
TheIncorrigible1
5

saya tidak tahu bagaimana Anda bisa membuat kecocokan antara registri dan apa yang muncul di ftype dan assoc. Bagi saya dan seperti yang saya lihat, perintah ftype dan assoc tidak berguna. Apa yang saya lakukan untuk mengubah program default untuk ekstensi yang diberikan dalam cara yang terprogram (vs standar dan cara yang lebih sederhana menggunakan explorer) adalah memodifikasi kunci registri ini

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

Misalnya, jika saya ingin membuka mp3s saya dengan mplayer saya memasukkan

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

nilai "mplayerc.mp3"

Apa komplikasi dari melakukan ini: pertama Anda harus tahu valid ProgIDs (gunakan ftype), dan kedua Anda perlu akses tulis ke sarang itu. Windows secara otomatis menempatkan ACL penolakan untuk kunci UserChoice, jadi Anda perlu menemukan cara untuk menghapus aturan penolakan itu untuk mendapatkan akses tulis. Saya menggunakan subinacl program, yang dapat Anda unduh dari sini http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en untuk mengubah izin. Anda juga dapat menggunakan program pihak ketiga SetACL. Saya merekomendasikan yang pertama karena sintaksnya jauh lebih sederhana.

mjsr
sumber
3

Explorer (shell Windows) selalu memberikan preferensi ke aplikasi yang ditentukan dalam kunci vendor yang ditentukan di bawah nilai default ekstensi. (Dalam kasus Anda .pyadalah ekstensi, Python.Fileadalah kunci vendor.)

ftypedan assocmungkin membaca nilainya dari daerah lain, saya tidak tahu pasti. Itulah bagaimana Explorer melakukannya.

EDIT: Halaman ini mungkin menarik bagi Anda: MSDN - Jenis File

Terutama ini:

Subtree HKEY_CLASSES_ROOT adalah pandangan yang dibentuk dengan menggabungkan HKEY_CURRENT_USER \ Software \ Classes dan HKEY_LOCAL_MACHINE \ Software \ Classes.

Mungkin di sinilah berbagai bagian Windows berbenturan, jika ada asosiasi "default" di HKEY_LOCAL_MACHINE, yang ditimpa oleh yang Anda tetapkan di akun Anda (yang kemudian akan disimpan di HKEY_CURRENT_USER).


sumber
3

Microsoft telah mengubah cara kerjanya dari Windows 8 dan seterusnya. Tidak lagi mungkin untuk mengedit registri untuk mengubah ini. Untuk mengutip Microsoft :

Di Pra-Menang 8, aplikasi dapat mengatur penangan default untuk jenis file / protokol dengan memanipulasi registri, ini berarti Anda dapat dengan mudah memiliki skrip atau kebijakan grup yang memanipulasi registri. Namun Di Win 8, perubahan registri diverifikasi oleh hash (unik per pengguna dan aplikasi) yang mendeteksi gangguan oleh aplikasi. Dengan tidak adanya hash yang valid, kami mengabaikan default di registri.

Cara Microsoft mengharapkan Anda untuk mengubah ini sekarang adalah dengan file xml yang diimplementasikan melalui Kebijakan Grup. Instruksi di sini .

Untungnya Christoph Kolbicz telah merekayasa balik algoritma hashing dan menciptakan alat yang disebut SetUserFTA untuk mengatur asosiasi tipe file. Sayangnya itu adalah sumber tertutup.

pholcroft
sumber
SetUserFTA sangat berguna, dan dapat dituliskan.
DaveInCaz
1

Kebingungan di sini adalah antara apa yang digunakan untuk membuka file dan apa yang digunakan untuk menjalankan file. Kunci registri

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

adalah apa yang memberitahu windows cara membuka file. Mengklik dua kali pada file tersebut akan membuka file dengan aplikasi ini.

Karena file tersebut bukan file yang dapat dieksekusi, baris perintah mengasumsikan bahwa Anda ingin membuka file dengan aplikasi default, seolah-olah Anda telah mengklik dua kali.

Mengubah asosiasi kembali ke C: \ Program \ Python27 \ python.exe atau mengedit kunci registri untuk menunjuk ke python harus mengembalikannya seperti semula, di mana windows menganggap Anda ingin membuka file dengan program default, yaitu python.exe, yang kemudian menjalankan program.

Majenko
sumber
Jika saya mengerti dengan benar, kunci .py\Applicationtersebut digunakan untuk membuka file py. Apa yang saya tidak mengerti adalah dalam kasus apa nilai dalam Python.Filedigunakan.
Gauthier
Menurut Majenko itu tergantung pada cuaca ekstensi yang diberikan diperlakukan oleh Windows seperti dieksekusi (lihat PATHEXTvariabel). Namun saya ingat pernah membaca di masa lalu bahwa rekanan yang dibuat dari dalam Explorer selalu menimpa yang dari Classeskunci registri.
Piotr Dobrogost
1

Petunjuk terbesar Anda untuk tujuan dan lokasi adalah dalam "tipe besar", yaitu, nama-nama sarang masing-masing: HKLM dan HKCU

Asosiasi file diatur dalam kedua sarang dan memiliki dua tujuan berbeda:

Sesuai namanya, entri registri HKCU mengatur asosiasi file untuk PENGGUNA SAAT INI dan mengabaikan pengaturan jenis file yang sesuai di HKLM.

HKLM menetapkan asosiasi file untuk MESIN LOKAL, yaitu, untuk SEMUA PENGGUNA mesin (kecuali diganti oleh entri HKCU). (Untuk Win98, HKCR hanyalah alias singkat untuk Kelas HKLM \ Software \. Tidak ada sarang terpisah atau berbeda. Namun, ini berubah untuk Win XP dan tidak lagi benar. HKCR sekarang menjadi sarang virtual yang merupakan hasil penggabungan HKLM \ Software \ Classes \, HKCU \ Software \ Classes \, dan HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts kunci dengan info HKCU yang diutamakan.)

Sistem dua langkah ini memfasilitasi tidak hanya skema asosiasi file satu-ke-satu tetapi banyak-ke-satu dan satu-ke-banyak. Misalnya, filetipe .htm, .html, dan .shtml semuanya dapat diatur ke ProgID = htmlfile yang pada gilirannya dapat menentukan satu browser. OTOH, entri dapat berisi subkunci OpenWithList atau OpenWithProgID dengan beberapa entri untuk membuka file dari daftar beberapa browser, editor, atau aplikasi lain.

Kelas HKLM \ Software \ Classes dan HKCU \ Software \ beroperasi dengan cara yang sama (yang satu lebih diutamakan daripada yang lain). Dalam bentuk paling sederhana ada kunci registri untuk ekstensi file (misalnya, HKCR.txt) yang nilai defaultnya adalah ProgID yang sesuai (misalnya, txtfile). Selain, atau alih-alih, nilai default, mungkin ada nama ProgID tambahan yang tercantum untuk subkunci "OpenWithProgID" (mis., Txtfile dan htmlfile), dan / atau nama aplikasi tambahan yang muncul sebagai subkunci di bawah "OpenWithList" (mis. Notepad ++ .exe, Opera.exe, Firefox.exe).

Setiap ProgID didefinisikan pada kunci lain dalam HKCR (mis., HKCR \ txtfile). Kunci ini berisi subkunci untuk memberi tahu windows ikon mana yang akan digunakan dan cara membuka, mencetak, mencetak, dll file terkait (mis., G, perintah HKCR \ txtfile \ shell \ open \). Demikian pula, setiap nama aplikasi didefinisikan sebagai subkunci di bawah HKCR \ Applications (mis., HKEY_CLASSES_ROOT \ Applications \ Firefox.exe \ shell \ open \ command).

Selain kunci HKCU \ Software \ Classes, asosiasi file akun pengguna ditemukan di kunci HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts. Entri ini bukan hanya untuk Windows Explorer seperti yang telah disarankan tetapi merupakan sumber tambahan dari pengesampingan asosiasi file akun pengguna. Entri dibuat oleh alat asosiasi file di explorer (Explorer \ Tools \ Folder Options \ Jenis File) dan berisi OpenWithList dan / atau subkunci OpenwithProgID untuk setiap ekstensi file yang terdaftar.

Untuk menentukan hubungan file, Windows pertama-tama melihat entri HKCU untuk ekstensi file yang sesuai. Hanya jika tidak ditemukan entri HKLM ikut bermain. (Catatan: Saya belum menguji yang lebih diutamakan - HKCU \ Software \ Classes atau HKCU \ MIcrosoft \ Windows \ CurrentVersion \ Explorer \ FileExts tapi saya menduga itu akan menjadi kunci FileExts). Demikian juga, jika ProgID atau nama aplikasi yang dirujuk tidak ditemukan di HKCU, entri HKLM dicari. (Perhatikan bahwa entri \ Applications \ hanyalah nama yang arbitrer - meskipun biasanya identik dengan nama file exe disk sebenarnya.)

Jadi untuk menentukan asosiasi file untuk akun pengguna tertentu, buat entri dalam sarang HKCU. Untuk menentukan asosiasi untuk semua pengguna, buat entri di HKLM hive (HKCR) dan hapus semua referensi di HKCU hive untuk tipe file itu. Jelas Anda membutuhkan hak akses yang sesuai untuk kunci registri.

Saya tidak menggunakan alat assoc dan ftype karena saya lebih suka menggunakan RegEdit baik dalam mode interaktif atau batch tetapi dari komentar lain tampaknya mereka hanya beroperasi pada HKLM hive dan tidak berguna untuk membersihkan / mengatur kunci HKCU. Luangkan waktu dan telusuri kunci yang disebutkan di atas dengan RegEdit untuk melihat lebih banyak contoh.

ArtKns
sumber
HKCR tidak berfungsi seperti yang Anda pikirkan. Di HKCR, saya memiliki entri "kode sumber". "sourcecode" tidak ada di HKLM \ Software \ Classes. Di sisi lain, di HKCU \ Software \ Classes, "sourcecode" hadir. Jadi, jelas HKCR termasuk entri dari HKCU \ Software \ Classes. Di sisi lain, ada HKCR dan HKLM "SoundRec" dan "SPCFile". Tetapi Kelas HKCU \ Software \ tidak memiliki ini. Dengan demikian, HKCR juga jelas termasuk entri dari HKLM. HKCR jelas menggabungkan dua lokasi dalam beberapa cara. Juga lihat superuser.com/a/266274
Ben