2013-06-12 42 views
1

因此,我編寫了一個在Windows7/8/Vista/XP系統啓動時運行的python應用程序。第一次運行時,我希望它將幾個文件類型/擴展與系統上的某個程序相關聯。暫時,我這樣做是這樣的:將文件關聯到python的程序

import win32com.shell.shell as shell 

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

問題是,從啓動時運行,這有時無法工作。我讀hereShellExecuteEx不會輸出它的調用過程中的錯誤,所以我沒有看到有什麼鬆散的結尾,也閱讀therelpVerb="runas"通常被認爲是不好的做法。

我assoc.bat需要,因爲它是寫了下面的方法管理員審覈:

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

(在這裏我關聯微軟的記事本與Windows爲「TXT」和「你好」擴展名的。當然是沒有意義的,但是是一個很好的例子。)

據我所知,Windows不提供一個命令行工具,使我們能夠爲當前用戶文件擴展名的程序關聯僅(這已經很不錯了我努力實現)。
On this article我讀assoc會影響Windows安裝中每個用戶帳戶使用的註冊表區域,而不是可以在沒有管理員權限的情況下寫入的HKEY_CURRENT_USER

我讀了另一個回答here建議檢查sys.argv[-1] != "asadmin",但sys.argv似乎是每次我的應用程序運行時一個空的數組。

1)我可以確保ShellExecuteEx運行並在需要時提示輸入管理員權限嗎?

2)也許有一種方法,我可以創建一個批處理文件,將這些擴展名與當前用戶關聯嗎?比起來,我不需要使用被認爲是錯誤來源的'runas'參數。

有一點需要注意的是:實際上,我是在編程的時候生成這個批處理文件的,但這裏沒有討論它,因爲它並沒有真正涉及到這個問題。

回答

1

可能最簡單的做法是製作一個.reg文件並執行,以便您可以直接在reg文件中編寫所需的註冊表項。例如:

Windows Registry Editor Version 5.00 

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

您顯然也可以製作myNotepad類型。您可以副教授,然後用註冊表編輯器使reg文件(選擇鍵和人民幣+出口),你可以告訴窗口靜默安裝了reg如果你使用:

regedit -s your_reistration_file.reg 

現在,您可以撥打上面的線ShellExecuteEx。請注意,用戶可能沒有權利使用reg文件編輯註冊表。

您也可以編輯註冊表蟒蛇直接,這裏是上面看到文檔的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') 
+0

偉大的東西。我會測試一下並更新它的方式。 – user1555863