将扩展名与程序关联的脚本

11
我的客户正在将部分工作站上的MS Office更换为OpenOffice。我的程序使用.xml扩展名(使用开放格式)将文件导出到Excel,并使用当前关联的程序(使用ShellExecute)打开它。
问题是OpenOffice没有注册与之相关联的.xml扩展名。
手动关联可以正常工作,但我想制作一个.reg或类似的东西来轻松更改设置。
我正在查看已经进行更改的PC中的注册表,但是...
"HKEY_CLASSES_ROOT\.xml" 

关键字没有任何引用OpenOffice的内容。

关联数据存储在哪里?如何编写脚本来执行此操作?


请查看 https://superuser.com/q/406985/8271 - Tim Abell
4个回答

17

真正的关联存储在指向"HKEY_CLASSES_ROOT\.xml"的键中。

在我的计算机上,该键的默认值为"xmlfile",很可能您的计算机也是如此。

因此,让我们进入"HKEY_CLASSES_ROOT\xmlfile"。在那里,您可以看到(并更改)将用于启动该类型文件的命令:

HKEY_CLASSES_ROOT\xmlfile\shell\open\command

Windows使用这种重定向方式将多个文件扩展名映射到同一文件类型,从而映射到同一应用程序。

"HKEY_CLASSES_ROOT\xmlfile\shell"下有多个子键类似于可以对文件执行的“动词”。同样,"shell"键的默认值决定了如果双击该文件要使用哪个“动词”。在我的情况下,这是"open"

结论:

具有此知识后,使关联脚本化的最简单方法是使用regedit导出包含该更改的.reg文件,并通过双击或以下方法将其应用于目标计算机:

regedit /s new_xml_association.reg

或者(如果您使用的是XP或更高版本并且知道自己在做什么)用以下内容覆盖当前值:

reg add "HKEY_CLASSES_ROOT\xmlfile\shell\open\command" /ve /d "path\to\program %1"

无论如何,建议对reg add/?命令进行深入了解。第一个方案更安全。


在我的电脑上,这个键指向“C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSOXMLED.EXE” /verb open“%1”,但是可能这个.exe文件会打开OpenOffice calc应用程序。 - Eduardo Molteni
如果你想启动它,应该使用OpenOffice Calc应用程序。"MSOXMLED.EXE"确实是随InfoPath一起提供的MS Office XML编辑器。 - Tomalak
不确定这是否是关键。如果我删除它,双击仍然有效。 - Eduardo Molteni
你好! 我使用了SharpShell,并在资源管理器上下文菜单中创建了一个项目。当我(用户)右键单击某些歌曲文件并单击我的添加的项目时,这些文件将添加到我的音乐播放器中。现在我想通过双击(打开,按回车键)文件来实现它。你知道怎么做吗?你能帮我吗?谢谢! - ACE

2
考虑一下dos命令assoc:
C:>assoc /? 显示或修改文件扩展名关联。
ASSOC [.ext[=[fileType]]] .ext 指定要将文件类型与之关联的文件扩展名。 fileType 指定要将文件扩展名与之关联的文件类型。
不带参数输入ASSOC以显示当前文件关联。如果只使用文件扩展名调用ASSOC,则会显示该文件扩展名的当前文件关联。对于文件类型不指定任何内容,该命令将删除文件扩展名的关联。

"assoc还可以更改关联的应用程序吗?它一直存在还是新于XP或其他什么东西?至少对我来说是新的..." - Tomalak
"Assoc.xml" 返回 ".xml=xmlfile" "Assoc xmlfile" 返回 "xmlfile=XML文档" 无法继续,因为Assoc不接受空格。 - Eduardo Molteni
@Eduardo 你应该能够引用空格。 - kenny

1

在这种情况下使用文件关联似乎是错误的。 希望您的应用程序在OpenOffice中打开文件,但是如果用户想保留XML文件的文件关联怎么办?如果他们系统上的其他东西也依赖于该关联,那么您会破坏他们的系统。如果您是IT人员,则可能可以(仍然是可疑的编程实践),但如果不是,则这样做是不好的。

改用OpenOffice COM实现来打开文件。

这里有一个很好的简单示例: http://www.kalitech.fr/clients/doc/VB_APIOOo_en.html


-1

进一步调查后发现最好使用AssocQueryString,它不需要物理文件进行查找:http://www.pinvoke.net/default.aspx/shlwapi/AssocQueryString.html - TheCodeKing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接