Làm cách nào để tôi có được ftype & PGS phù hợp với Windows Explorer?


20

Tôi đã thay đổi liên kết để sử dụng khi khởi chạy một .pytệp, thông qua Windows Explorer:

  1. Công cụ -> Thư mục -> Loại tệp.
  2. Sau đó duyệt đến .py.
  3. Thay đổi liên kết thành Wordpad.

Bây giờ khi tôi gõ tên của tệp py trong dòng lệnh, Wordpad sẽ mở nó.

Nhưng assocftypetrong dòng lệnh vẫn trở lại như sau:

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

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

Tại sao hiệp hội đang làm việc, nhưng assocftypekhông nhận thức được nó?

Tôi đã khởi động lại lời nhắc.


Thêm thông tin từ đăng ký của tôi:

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

Đăng ký khác:

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

Tôi cho rằng đây là những gì đang hiển thị trong ftype Python.File. Nhưng nó dường như không được sử dụng.


(Tôi đang làm điều này để thử nghiệm, vì vậy cuối cùng tôi có thể chọn phiên bản Python mặc định của mình một cách dễ dàng).


Câu trả lời:


9

Tùy thuộc vào cách bạn gọi một tập tin sẽ phụ thuộc vào động từ được sử dụng. Động từ bạn sử dụng xác định những gì Windows sẽ làm với nó. Các động từ tiêu chuẩn là Mở, Chỉnh sửa, In, Chơi và Xem trước. Tuy nhiên, có thể tạo động từ của riêng bạn . Động từ được thêm nhiều nhất là Open With Family (bao gồm OpenWithProgID), thêm menu phụ ngữ cảnh nhỏ đó trong "Open With" để cung cấp cho bạn các lựa chọn thay thế có thể. Ví dụ: nếu bạn cài đặt Paint.NET, sau đó bấm chuột phải vào tệp .jpg, bạn sẽ thấy mục Mở với mở rộng ra một menu con liệt kê Paint.NET, Paint và bất cứ thứ gì Microsoft gọi là trình xem ảnh cho phiên bản của bạn của Windows.

Ngoài ra, những gì Unsign Code Labs nói là rất quan trọng. Khi bạn gỡ lỗi các lớp, bạn cần xem HKLM\Software\Classes\HKCU\Software\Classes. HKCRlà rất hữu ích để truy vấn hệ thống, nhưng không tốt cho việc tìm hiểu lý do tại sao nó hoạt động sai.

Tôi đã thực hiện một thử nghiệm nhỏ trên hệ thống Windows 7 procmon.execủa mình assocftypecác lệnh và dường như cố gắng ghi trực tiếp vào HKCRvà hệ thống dường như diễn giải điều đó như là viết cho HKLM. Tài khoản hiện tại của tôi là thành viên của nhóm quản trị, nhưng UAC được bật. Tôi đã truy cập bị từ chối khi tôi cố gắng assoc .mytest=MyTest.File.

Thật kỳ lạ, nếu tôi tạo một liên kết bằng cách nhấp chuột phải vào một tệp được gọi test.mytestvà liên kết nó với Notepad, thì assoccũng không ftypethấy liên kết này. Hiệp hội chắc chắn là có trong HKCUHKCR. Tôi đã không thử khởi động lại, tuy nhiên.



Liên kết @ TheIncorritable1 đã chết :(
DaveInCaz

@DaveInCaz Ôi thật buồn. Tôi bực mình vì họ đã phá vỡ tất cả các liên kết blog của MSFT. Tôi sẽ xem nếu tôi có thể khôi phục nó; hy vọng nó chỉ có một liên kết mới và không biến mất (như trường hợp của một số thứ khác)
TheIncorritable1


5

Tôi không biết làm thế nào bạn có thể làm cho khớp giữa registry và những gì xuất hiện trong ftype và PGS. Đối với tôi và như tôi thấy với bạn, lệnh ftype và PGS là vô dụng. Những gì tôi làm để thay đổi chương trình mặc định cho một tiện ích mở rộng nhất định theo cách lập trình (so với cách tiêu chuẩn và đơn giản hơn bằng cách sử dụng explorer) là sửa đổi khóa đăng ký này

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

Ví dụ, nếu tôi muốn mở mp3 của mình bằng mplayer tôi đã đặt

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

giá trị của "mplayerc.mp3"

Sự phức tạp của việc làm này là gì: đầu tiên bạn cần biết các ProgIDs (sử dụng ftype), và thứ hai bạn cần quyền truy cập ghi vào tổ ong đó. Windows tự động đặt từ chối ACL cho khóa UserChoice, vì vậy bạn cần tìm cách xóa quy tắc từ chối đó để có quyền truy cập ghi. Tôi sử dụng chương trình con, mà bạn có thể tải xuống từ đây http://www.microsoft.com/doads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=vi để sửa đổi các quyền. Ngoài ra, bạn có thể sử dụng chương trình bên thứ 3 SetACL. Tôi khuyên bạn nên đầu tiên vì cú pháp đơn giản hơn rất nhiều.


3

Explorer (vỏ Windows) luôn ưu tiên cho ứng dụng được chỉ định trong khóa nhà cung cấp được chỉ định theo giá trị mặc định của tiện ích mở rộng. (Trong trường hợp của bạn .pylà tiện ích mở rộng, Python.Filelà khóa nhà cung cấp.)

ftypeassoccó thể đọc giá trị của họ từ các khu vực khác, tôi không biết chắc chắn. Đó chỉ là cách Explorer làm điều đó.

EDIT: Trang này có thể bạn quan tâm: MSDN - Loại tệp

Đặc biệt là:

Cây con HKEY_CLASSES_ROOT là chế độ xem được hình thành bằng cách hợp nhất HKEY_CURRENT_USER \ Software \ Classes và HKEY_LOCAL_MACHINE \ Software \ Classes.

Có lẽ đây là nơi các phần khác nhau của Windows đụng độ, nếu có một liên kết "mặc định" trong HKEY_LOCAL_MACHINE, sẽ bị ghi đè bởi tài khoản bạn đã xác định trên tài khoản của mình (sau đó sẽ được lưu trữ trong HKEY_CURRENT_USER).


3

Microsoft đã thay đổi cách thức hoạt động của Windows 8 trở đi. Không còn có thể chỉnh sửa sổ đăng ký để thay đổi điều này. Đến trích dẫn Microsoft :

Trong Pre-Win 8, các ứng dụng có thể đặt trình xử lý mặc định cho loại / giao thức tệp bằng cách thao tác đăng ký, điều này có nghĩa là bạn có thể dễ dàng có tập lệnh hoặc chính sách nhóm thao tác với sổ đăng ký. Tuy nhiên, trong Win 8, các thay đổi đăng ký được xác minh bằng hàm băm (duy nhất cho mỗi người dùng và ứng dụng) phát hiện sự giả mạo của các ứng dụng. Trong trường hợp không có hàm băm hợp lệ, chúng tôi bỏ qua mặc định trong sổ đăng ký.

Cách Microsoft mong đợi bạn thay đổi điều này ngay bây giờ là với tệp xml được triển khai thông qua Chính sách nhóm. Hướng dẫn tại đây .

Rất may, Christoph Kolbicz đã thiết kế ngược thuật toán băm và tạo ra một công cụ có tên SetUserFTA để thiết lập liên kết loại tệp. Thật không may, nó là nguồn đóng.


SetUserFTA là siêu hữu ích và có thể được viết kịch bản.
DaveInCaz

1

Sự nhầm lẫn ở đây là giữa những gì được sử dụng để mở một tệp và những gì được sử dụng để chạy một tệp. Khóa đăng ký

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

là những gì cho windows biết cách mở tập tin. Nhấp đúp chuột vào tập tin sẽ mở tập tin với ứng dụng này.

Vì tệp không phải là tệp thực thi, dòng lệnh giả định rằng bạn muốn mở tệp bằng ứng dụng mặc định, như thể bạn đã nhấp đúp vào tệp.

Thay đổi liên kết trở lại C: \ Chương trình \ Python27 \ python.exe hoặc chỉnh sửa khóa đăng ký để trỏ đến python nên trả nó về trạng thái trước đây, trong đó các cửa sổ giả định bạn muốn mở tệp bằng chương trình mặc định, đó là python.exe, sau đó chạy chương trình.


Nếu tôi hiểu chính xác, khóa .py\Applicationđược sử dụng để mở các tệp py. Những gì tôi không hiểu là trong trường hợp nào giá trị trong Python.Fileđược sử dụng.
Gauthier

Theo Majenko, nó phụ thuộc vào thời tiết mở rộng được xử lý bởi Windows như thực thi (xem PATHEXTbiến). Tuy nhiên, tôi nhớ lại việc đọc trong quá khứ rằng các cộng sự được tạo từ bên trong Explorer luôn ghi đè lên những người từ Classeskhóa đăng ký.
Piotr Dobrogost

1

Manh mối lớn nhất của bạn về mục đích và vị trí nằm trong "loại lớn", nghĩa là tên của các tổ ong tương ứng: HKLM và HKCU

Liên kết tệp được đặt trong cả hai tổ ong và có hai mục đích khác nhau:

Như tên ngụ ý, các mục đăng ký HKCU thiết lập các liên kết tệp cho NGƯỜI DÙNG HIỆN TẠI và ghi đè cài đặt loại tệp tương ứng trong HKLM.

HKLM thiết lập các liên kết tệp cho MÁY ĐỊA PHƯƠNG, nghĩa là, đối với TẤT CẢ NGƯỜI SỬ DỤNG của máy (trừ khi bị ghi đè bởi các mục HKCU). (Đối với Win98, HKCR chỉ là bí danh viết tắt của HKLM \ Software \ Classes. Chúng không tách rời hoặc khác nhau. Tuy nhiên, điều này đã thay đổi đối với Win XP và không còn đúng nữa. HKCR giờ đây là một tổ ong ảo là kết quả của việc hợp nhất các khóa HKLM \ Software \ Classes \, HKCU \ Software \ Classes \ và HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts với thông tin HKCU được ưu tiên.)

Hệ thống hai bước này tạo điều kiện thuận lợi không chỉ cho một-một mà nhiều chương trình liên kết tệp một-nhiều và một-nhiều. Ví dụ: các loại tệp .htm, .html và .shtml đều có thể được đặt thành ProgID = htmlfile, từ đó có thể xác định một trình duyệt duy nhất. OTOH, các mục có thể chứa các khóa con OpenWithList hoặc OpenWithProgID với nhiều mục để mở tệp từ danh sách nhiều trình duyệt, trình soạn thảo hoặc ứng dụng khác.

Cả HKLM \ Software \ Classes \ và HKCU \ Software \ Classes đều hoạt động theo cùng một cách (cái này chỉ được ưu tiên hơn cái kia). Ở dạng đơn giản nhất, có khóa đăng ký cho phần mở rộng tệp (ví dụ: HKCR.txt) có giá trị mặc định là ProgID tương ứng (ví dụ: txtfile). Ngoài, hoặc thay vì giá trị mặc định, có thể có thêm các tên ProgID được liệt kê cho khóa con "OpenWithProgID" (ví dụ: txtfile và htmlfile) và / hoặc các tên ứng dụng bổ sung xuất hiện dưới dạng các khóa con trong "OpenWithList" (ví dụ: Notepad ++ .exe, Opera.exe, Firefox.exe).

Mỗi ProgID được xác định trong một khóa khác trong HKCR (ví dụ: HKCR \ txtfile). Khóa này chứa các khóa con để báo cho windows biết sử dụng biểu tượng nào và cách mở, in, in, v.v. tập tin liên quan (e., G, HKCR \ txtfile \ shell \ open \ lệnh). Tương tự, mỗi tên ứng dụng được định nghĩa là một khóa con trong HKCR \ Application (ví dụ: HKEY_CLASSES_ROOT \ Application \ Firefox.exe \ shell \ open \ lệnh).

Ngoài khóa HKCU \ Software \ Classes, các liên kết tệp tài khoản người dùng được tìm thấy trong khóa HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts. Các mục này không chỉ dành cho Windows Explorer như đã được đề xuất mà là một nguồn bổ sung của ghi đè tệp tài khoản người dùng. Các mục nhập được tạo bởi các công cụ liên kết tệp trong explorer (Explorer \ Tools \ Directory Options \ File Type) và chứa OpenWithList và / hoặc một khóa con OpenwithProgID cho mỗi phần mở rộng tệp được liệt kê.

Để xác định liên kết tệp, Windows trước tiên nhìn vào các mục HKCU cho phần mở rộng tệp tương ứng. Chỉ khi không tìm thấy thì các mục HKLM mới được sử dụng. (Lưu ý: Tôi chưa kiểm tra được ưu tiên - HKCU \ Software \ Classes hoặc HKCU \ MIcrosoft \ Windows \ CurrentVersion \ Explorer \ FileExts nhưng tôi nghi ngờ đó sẽ là khóa FileExts). Tương tự, nếu không tìm thấy ProgID hoặc tên ứng dụng được tham chiếu trong HKCU, các mục HKLM được tìm kiếm. (Lưu ý rằng các mục \ Ứng dụng \ chỉ là tên tùy ý - mặc dù chúng thường giống hệt với tên tệp exe thực tế trên đĩa.)

Vì vậy, để xác định liên kết tệp cho một tài khoản người dùng cụ thể, hãy tạo các mục trong tổ hợp HKCU. Để xác định liên kết cho tất cả người dùng, hãy tạo các mục trong tổ hợp HKLM (HKCR) và xóa tất cả các tham chiếu trong tổ hợp HKCU cho loại tệp đó. Rõ ràng bạn cần quyền truy cập thích hợp vào các khóa registry.

Tôi không sử dụng các công cụ hỗ trợ và ftype vì tôi thích sử dụng RegEdit ở chế độ tương tác hoặc theo đợt nhưng từ các bình luận khác, có vẻ như chúng chỉ hoạt động trên tổ ong HKLM và vô dụng để xóa / cài đặt các khóa HKCU. Dành chút thời gian và duyệt các phím đã nói ở trên với RegEdit để xem thêm các ví dụ.


HKCR không hoạt động theo cách bạn nghĩ. Trong HKCR, tôi có một mục "sourcecode". "sourcecode" không tồn tại trong HKLM \ Software \ Classes. Mặt khác, trong HKCU \ Software \ Classes, "sourcecode" có mặt. Vì vậy, rõ ràng HKCR bao gồm các mục từ HKCU \ Software \ Classes. Mặt khác, trong cả HKCR và HKLM "SoundRec" và "SPCFile" đều có mặt. Nhưng HKCU \ Software \ Classes không có những thứ này. Do đó, HKCR rõ ràng cũng bao gồm các mục từ HKLM. HKCR chắc chắn đang hợp nhất hai địa điểm trong một số thời trang. Ngoài ra, hãy xem superuser.com/a/266274
Ben
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.