我通过 Windows 资源管理器更改了启动文件时使用的关联.py
:
- 工具->文件夹->文件类型。
- 然后浏览到
.py
。 - 将关联更改为写字板。
现在,当我在命令行中键入 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 版本)。
答案1
调用文件的方式取决于使用的动词。使用的动词决定了 Windows 将如何处理它。标准动词是打开、编辑、打印、播放和预览。但是,可以创建自己的动词最常添加的动词是与家人一起开放(包括 OpenWithProgIDs),在“打开方式”下添加了一个小的上下文子菜单,为您提供可能的替代方案。例如,如果您安装 Paint.NET,然后右键单击 .jpg 文件,您将看到“打开方式”条目展开为一个子菜单,其中列出了 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
。 但是,我还没有尝试重新启动。
答案2
我不知道如何让注册表与 ftype 和 assoc 中的内容相匹配。在我看来,而且在我看来,你也觉得 ftype 和 assoc 命令毫无用处。我以编程方式(相对于使用 explorer 的标准和更简单的方式)更改给定扩展的默认程序的方法是修改此注册表项
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/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en修改权限。您也可以使用第三方程序 SetACL。我推荐第一个,因为语法简单得多。
答案3
Microsoft 从 Windows 8 开始改变了这一工作方式。现在无法再通过编辑注册表来更改这一点。引用微软:
在 Win 8 之前的版本中,应用程序可以通过操纵注册表来设置文件类型/协议的默认处理程序,这意味着您可以轻松使用脚本或组策略来操纵注册表。然而,在 Win 8 中,注册表更改通过哈希值(每个用户和应用程序独有)进行验证,该哈希值可检测应用程序的篡改行为。如果没有有效的哈希值,我们将忽略注册表中的默认值。
Microsoft 希望您现在使用通过组策略实施的 xml 文件来更改此设置。说明这里。
值得庆幸的是,Christoph Kolbicz 对哈希算法进行了逆向工程,并创建了一个名为设置用户FTA设置文件类型关联。不幸的是,它是闭源的。
答案4
这里的混淆在于打开一个文件以及用来跑步文件。注册表项
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
\.py\Application
是告诉 Windows 如何打开文件。双击文件将使用此应用程序打开文件。
由于该文件不是可执行文件,命令行假定您要使用默认应用程序打开该文件,就像您双击它一样。
将关联改回 C:\Program\Python27\python.exe 或编辑注册表项以指向 python 应该将其恢复到以前的状态,其中 Windows 假定您想使用默认程序(即 python.exe)打开该文件,然后运行该程序。