从python将文件关联到程序

从python将文件关联到程序,python,batch-file,registry,pywin32,shellexecute,Python,Batch File,Registry,Pywin32,Shellexecute,因此,我编写了一个python应用程序,它在Windows7/8/Vista/XP系统启动时运行。第一次运行时,我希望它将一些文件类型/扩展名与系统上的某个程序相关联。目前,我是这样做的: import win32com.shell.shell as shell def runAssoc(): shell.ShellExecuteEx( lpVerb="runas", lpFile='c:\\Users\\myUser\\assoc.bat') 问题是,当从启动开始运

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

import win32com.shell.shell as shell

def runAssoc():
    shell.ShellExecuteEx(
    lpVerb="runas",
    lpFile='c:\\Users\\myUser\\assoc.bat')
问题是,当从启动开始运行时,这有时会失败。我已经读到,
ShellExecuteEx
不会将其错误输出到调用进程,因此我看不出在这方面会出现什么问题,并且还阅读了一些文章,因为
lpVerb=“runas”
通常被认为是一种不好的做法

My assoc.bat需要管理员批准,因为它是按以下方式编写的:

assoc .txt=myNotepad
assoc .hello=myNotepad
ftype myNotepad="C:\Windows\system32\notepad.exe" "%%1"
(这里我将微软随Windows提供的记事本与“txt”和“hello”扩展相关联。这当然没有意义,但这是一个很好的例子。)

我知道Windows没有提供命令行工具,允许我们仅为当前用户将文件扩展名与程序关联(这对我正在尝试实现的目标很好)
我读取了
assoc
影响Windows安装中每个用户帐户使用的注册表区域,而不是
HKEY\U CURRENT\U user
,该区域可以在没有管理员权限的情况下写入

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

1) 我能否确保在需要时运行并提示管理员权限

2) 也许有一种方法可以创建一个批处理文件,只将这些扩展名与当前用户关联?然后,我将不需要使用“runas”参数,因为它被认为是错误的来源


有一点旁注:实际上,我是以“编程方式”动态构建此批处理文件的,但这里不讨论这一点,因为它与问题并不真正相关。

最简单的方法可能是创建一个.reg文件并执行,您可以直接在reg文件中写入所需的注册表项。例如:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\.hello]
@="txtfile"
显然,你也可以将myNotepad类型设置为“我的记事本”。您可以关联并使用regedit生成注册表文件(选择key和rmb+导出)。如果您使用以下命令,您可以告诉Windows以静默方式安装注册表:

regedit -s your_reistration_file.reg
现在可以使用ShellExecuteEx调用上面的行。请注意,uer可能无权使用reg文件编辑注册表

您也可以直接在python中编辑注册表,下面是上面的示例,有关更多信息,请参阅docs for 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')

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

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\.hello]
@="txtfile"
显然,你也可以将myNotepad类型设置为“我的记事本”。您可以关联并使用regedit生成注册表文件(选择key和rmb+导出)。如果您使用以下命令,您可以告诉Windows以静默方式安装注册表:

regedit -s your_reistration_file.reg
现在可以使用ShellExecuteEx调用上面的行。请注意,uer可能无权使用reg文件编辑注册表

您也可以直接在python中编辑注册表,下面是上面的示例,有关更多信息,请参阅docs for 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')