因此,我编写了一个在 Windows7/8/Vista/XP 上系统启动时运行的 python 应用程序。第一次运行时,我希望它将一些文件类型/扩展名与系统上的某个程序相关联。目前,我是这样完成的:
import win32com.shell.shell as shell
def runAssoc():
shell.ShellExecuteEx(
lpVerb="runas",
lpFile='c:\\Users\\myUser\\assoc.bat')
问题是,当从启动时运行时,这有时无法正常工作。我在这里读过它ShellExecuteEx
不会将它的错误输出到调用进程,所以我看不出有什么松动,并且还阅读了那里lpVerb="runas"
给出的文章,这些文章通常被认为是一种不好的做法。
我的 assoc.bat 需要管理员批准,因为它的编写方式如下:
assoc .txt=myNotepad
assoc .hello=myNotepad
ftype myNotepad="C:\Windows\system32\notepad.exe" "%%1"
(在这里,我将 Windows 附带的 Microsoft 记事本与“txt”和“hello”扩展名相关联。这当然没有意义,但却是一个很好的例子。)
我了解 Windows 不提供命令行工具,允许我们将文件扩展名与仅适用于当前用户的程序相关联(这对于我想要实现的目标来说很好)。
在本文中,我阅读assoc
了 Windows 安装中每个用户帐户使用的注册表区域的效果,而不是HKEY_CURRENT_USER
可以在没有管理员权限的情况下写入该区域。
我在这里阅读了另一个答案,建议检查sys.argv[-1] != "asadmin"
,但sys.argv
每次我的应用程序运行时似乎都是一个空数组。
1) 我可以确保ShellExecuteEx
在需要时运行并提示管理员权限吗?
2)也许有一种方法可以创建一个批处理文件,将这些扩展名仅与当前用户相关联?比,我不需要使用'runas'参数,这应该是错误的来源。
一点旁注:实际上我是动态地“以编程方式”构建这个批处理文件,但这里没有讨论,因为它与问题没有真正的关系。