所以,我编写了一个在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'参数,这可能是错误的来源。
一点注意事项:实际上我会动态地“以编程方式”构建这个批处理文件,但这里没有讨论,因为它与问题没有关系。
答案 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')