如何获取ftype和assoc以匹配Windows资源管理器?


20

.py通过Windows资源管理器更改了在启动文件时使用的关联:

  1. 工具->文件夹->文件类型。
  2. 然后浏览到.py
  3. 将关联更改为写字板。

现在,当我在命令行中输入py文件的名称时,写字板将其打开。

但是assocftype在命令行中仍然返回以下内容:

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

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

为什么该协会的工作,但assocftype没有意识到这一点?

我确实重新启动了提示。


来自我的注册表的更多信息:

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版本)。


Answers:


9

根据调用文件的方式,取决于所使用的动词。您使用的动词决定了Windows将如何处理它。标准动词是“打开”,“编辑”,“打印”,“播放”和“预览”。但是,可以创建自己的动词。最常用的动词是“ 打开方式”家族(包括OpenWithProgID),它在“打开方式”下添加了少量上下文子菜单,为您提供了可能的替代选择。例如,如果您安装Paint.NET,然后右键单击.jpg文件,则会看到“打开方式”条目扩展为一个子菜单,该子菜单列出了Paint.NET,Paint以及Microsoft为您的版本所称的图片查看器Windows。

此外,Unsigned Code Labs所说的非常重要。在调试类时,需要查看HKLM\Software\Classes\HKCU\Software\ClassesHKCR对于查询系统非常有用,但对于找出其行为异常却不是那么有用。

我做了我的Windows 7系统上的一个小测试procmon.exe,以及assocftype命令似乎试图直接写入HKCR,系统显然解释,作为写HKLM。我当前的帐户是admin组的成员,但是启用了UAC。我尝试访问时被拒绝访问assoc .mytest=MyTest.File

奇怪的是,如果我通过右键点击一个名为关联test.mytest,并将它与记事本关联,既不assoc也没有ftype看到这种关联。关联肯定在HKCU和中HKCR。但是,我没有尝试重新启动。



@ TheIncorrigible1链接已死:(
DaveInCaz

@DaveInCaz哦,这真的很可悲。我很生气,他们破坏了所有MSFT博客链接。我看看是否可以恢复它;希望它只是有一个新的链接而不会消失(就像其他一些事情一样)
TheIncorrigible1


5

我不知道如何在注册表和ftype和assoc中显示的内容之间进行匹配。对我和我也一样,ftype和assoc命令是没有用的。我以编程方式(与使用资源管理器的标准且更简单的方式)更改给定扩展名的默认程序的方法是修改此注册表项

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

例如,如果我想用mplayer打开我的mp3,

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

“ mplayerc.mp3”的值

这样做的复杂性是什么:首先,您需要知道有效的ProgID(使用ftype),其次,您需要对该配置单元进行写访问。Windows自动为UserChoice密钥放置一个拒绝ACL,因此您需要找到一种删除该拒绝规则的方法以获得写访问权限。我使用了subinacl程序,您可以从此处下载http://www.microsoft.com/downloads/zh-CN/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en来修改权限。您也可以使用第三方程序SetACL。我推荐第一个,因为语法要简单得多。


3

资源管理器(Windows Shell)始终优先使用在扩展名的默认值下指定的供应商密钥中指定的应用程序。(在您的情况下.py,扩展名Python.File是供应商密钥。)

ftypeassoc可能从其他领域读取它们的价值,我不确定。这就是Explorer的工作方式。

编辑:您可能对此页感兴趣:MSDN-文件类型

特别是:

HKEY_CLASSES_ROOT子树是通过合并 HKEY_CURRENT_USER \ Software \ Classes和HKEY_LOCAL_MACHINE \ Software \ Classes 形成的视图。

如果在HKEY_LOCAL_MACHINE中存在“默认”关联,那么这可能是Windows不同部分发生冲突的地方,该关联将被您在帐户中定义的关联取代(然后将其存储在HKEY_CURRENT_USER中)。


3

Microsoft已更改了从Windows 8开始的工作方式。不再可能编辑注册表来更改此设置。要引用微软

在Win 8之前的版本中,应用程序可以通过操纵注册表来设置文件类型/协议的默认处理程序,这意味着您可以轻松地使用脚本或组策略来操纵注册表。但是,在Win 8中,注册表更改通过检测应用程序被篡改的哈希值(每个用户和应用程序唯一)来验证。在没有有效哈希的情况下,我们将忽略注册表中的默认值。

Microsoft希望您现在更改此方式的方法是使用通过组策略实现的xml文件。说明在这里

值得庆幸的是,Christoph Kolbicz对哈希算法进行了反向工程,并创建了一个名为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会使用其中的值。
Gauthier

根据Majenko的说法,这取决于天气,因为Windows将扩展名视为可执行文件(请参见PATHEXT变量)。但是,我回想起过去曾经读过的文章,即在资源管理器中创建的关联始终会覆盖Classes注册表项中的关联。
Piotr Dobrogost 2012年

1

有关用途和位置的最大线索是“大字型”,即相应蜂箱的名称:HKLM和HKCU

在两个配置单元中都设置了文件关联,它们具有两个不同的用途:

顾名思义,HKCU注册表项为CURRENT USER设置文件关联,并覆盖HKLM中的相应文件类型设置。

HKLM为本地机器(即机器的所有用户)设置文件关联(除非被HKCU条目覆盖)。(对于Win98,HKCR只是HKLM \ Software \ Classes的简写别名。它们不是单独的或不同的配置单元。但是,对于Win XP,这已不再适用,不再适用。HKCR现在是合并后的虚拟配置单元HKLM \ Software \ Classes \,HKCU \ Software \ Classes \和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)。除了默认值外,或代替默认值,可能还会为“ OpenWithProgID”子项(例如txtfile和htmlfile)列出其他ProgID名称,和/或在“ OpenWithList”下以子项的形式出现其他应用程序名称(例如Notepad ++) .exe,Opera.exe,Firefox.exe)。

每个ProgID在HKCR内的另一个键(例如HKCR \ txtfile)中定义。该键包含一些子键,这些子键告诉窗口使用哪个图标以及如何打开,打印,打印到等相关文件(例如HKCR \ txtfile \ shell \ open \ command)。同样,每个应用程序名称都被定义为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密钥)。同样,如果在HKCU中找不到引用的ProgID或应用程序名称,则会搜索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 \ Classes没有这些。因此,HKCR显然也包括HKLM的条目。HKCR肯定会以某种方式合并这两个地点。另请参见superuser.com/a/266274
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.