将文件与python中的程序相关联

时间:2013-06-12 14:14:23

标签: python batch-file registry pywin32 shellexecute

所以,我编写了一个在Windows7 / 8 / Vista / XP系统启动时运行的python应用程序。第一次运行时,我希望它将一些文件类型/扩展名与系统上的某个程序相关联。目前,我这样完成:

import win32com.shell.shell as shell

def runAssoc():
    shell.ShellExecuteEx(
    lpVerb="runas",
    lpFile='c:\\Users\\myUser\\assoc.bat')

问题是,从启动运行时,这有时无法工作。我已经读过here ShellExecuteEx没有将错误输出到调用进程,所以我看不到在这一点上发生了什么,并且还阅读了there给出的文章lpVerb="runas"通常被视为不良做法。

我的assoc.bat需要管理员批准,因为它的编写方式如下:

assoc .txt=myNotepad
assoc .hello=myNotepad
ftype myNotepad="C:\Windows\system32\notepad.exe" "%%1"

(这里我将Windows附带的微软记事本与“txt”和“hello”扩展相关联。这当然没有意义,但却是一个很好的例子。)

据我所知,Windows没有提供一个命令行工具,允许我们将文件扩展名与仅针对当前用户的程序关联(这对我正在尝试实现的目标做得很好)。
On this article我读了assoc影响Windows安装中每个用户帐户使用的注册表区域,而不是没有管理员权限可以写入的HKEY_CURRENT_USER

我读了另一个答案here建议检查sys.argv[-1] != "asadmin",但每次我的应用运行时,sys.argv似乎都是一个空数组。

1)我可以确保ShellExecuteEx运行并在需要时提示管理员权限吗?

2)也许有一种方法可以创建一个批处理文件,只将这些扩展名与当前用户相关联?比,我不需要使用'runas'参数,这可能是错误的来源。

一点注意事项:实际上我会动态地“以编程方式”构建这个批处理文件,但这里没有讨论,因为它与问题没有关系。

1 个答案:

答案 0 :(得分:1)

最简单的做法可能就是创建一个.reg文件并执行它,你可以直接在reg文件中编写你需要的注册表项。例如:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\.hello]
@="txtfile"

你显然可以制作myNotepad类型。您可以关联然后使用 regedit 来制作reg文件(选择键和rmb + export)如果您使用以下内容,您可以告诉窗口以静默方式安装reg:

regedit -s your_reistration_file.reg

现在您可以使用ShellExecuteEx调用上面的行。请注意,您可能无权使用reg文件编辑注册表。

您也可以直接在python中编辑注册表,这里有一个上面的示例,请参阅winreg的文档以获取更多信息:

import _winreg #just winreg in Python 3

key = _winreg.OpenKey(
    _winreg.HKEY_CURRENT_USER,
    r"Software\Classes"
    )

hello = _winreg.CreateKeyEx(key, ".hello")
_winreg.SetValue(hello, '', _winreg.REG_SZ, 'txtfile')