2011-07-24 111 views
8

如何使用Python更改Windows快捷方式?使用Python修改Windows快捷方式

例如来自:

H:\My Music\some_file.mp3 

到:

D:\Users\Myself\My Music\some_file.mp3 
+0

你有没有尝试过这样的:http://stackoverflow.com/questions/6805881/modify-windows-shortcuts-using-python/6806426 #6806426? – Hnatt

+0

[unicode快捷方式的后续问题](http://stackoverflow.com/questions/6916069/modify-windows-unicode-shortcuts-using-python) – Jonathan

回答

7

下面是使用Winshell库在Python中执行此操作的另一个更合适的方法:Using Python to create Windows shortcuts。在你的情况下,代码将如下所示:

import os, winshell 
from win32com.client import Dispatch 

desktop = winshell.desktop() 
path = os.path.join(desktop, "some_file.mp3.lnk") 
target = r"D:\Users\Myself\My Music\some_file.mp3" 
wDir = r"D:\Users\Myself\My Music" 
icon = r"D:\Users\Myself\My Music\some_file.mp3" 

shell = Dispatch('WScript.Shell') 
shortcut = shell.CreateShortCut(path) 
shortcut.Targetpath = target 
shortcut.WorkingDirectory = wDir 
shortcut.IconLocation = icon 
shortcut.save() 

现有的快捷方式应该被删除或重写。如果您需要它来批量处理快捷方式文件,那么我认为有一些方法可以从现有快捷方式中读取路径,但无法找到它。

+1

'winshell'可能并不遥远。仍然不是内置的。为了得到用户的桌面位置,你也可以这样做:'os.path.join(os.getenv('userprofile'),'desktop')' – ewerybody

2

另一种方法是详细here

使用快捷更新的例子。您可以,修改它,然后使用shortcut.SetPath()方法来设置它。

4

乔纳森的解决方案完美运作。这是我实现这个功能的有用功能。只需传入快捷方式文件的名称(例如“Mozilla Firefox.lnk”,无需指定整个文件路径)以及新的快捷方式目标,并且它将被修改。

import os, sys 
import pythoncom 
from win32com.shell import shell, shellcon 

def short_target(filename,dest): 
    shortcut = pythoncom.CoCreateInstance (
     shell.CLSID_ShellLink, 
     None, 
     pythoncom.CLSCTX_INPROC_SERVER, 
     shell.IID_IShellLink 
    ) 
    desktop_path = shell.SHGetFolderPath (0, shellcon.CSIDL_DESKTOP, 0, 0) 
    shortcut_path = os.path.join (desktop_path, filename) 
    persist_file = shortcut.QueryInterface (pythoncom.IID_IPersistFile) 
    persist_file.Load (shortcut_path) 
    shortcut.SetPath(dest) 
    mydocs_path = shell.SHGetFolderPath (0, shellcon.CSIDL_PERSONAL, 0, 0) 
    shortcut.SetWorkingDirectory (mydocs_path) 
    persist_file.Save (shortcut_path, 0) 

唯一的依赖是pywin32库。另请注意,您可以在其快捷方式目标中指定选项和参数。要实现,只要致电:

short_target("shortcut test.lnk",'C:\\') #note that the file path must use double backslashes rather than single ones. This is because backslashes are used for special characters in python (\n=enter, etc) so a string must contain two backslashes for it to be registered as one backslash character. 

这个例子将设置你的桌面上的快捷方式名为“快捷方式测试”,在硬盘驱动器的根目录下(C打开文件管理器快捷方式的目标: )。

+0

我正在寻找一种将'SetWorkingDirectory'设置为“像普通程序一样工作的捷径。这帮助了我。 –

0

以前的答案是完全有效的,但要真正完成它们我添加了批量编辑的代码,因为我想你可能有很多编辑链接。

使用这个,如果你想同时编辑多个链接:

import os, sys 
import glob 
import pythoncom 
from win32com.shell import shell, shellcon 

def shortcut_target (filename): 
    link = pythoncom.CoCreateInstance (
    shell.CLSID_ShellLink,  
    None, 
    pythoncom.CLSCTX_INPROC_SERVER,  
    shell.IID_IShellLink 
) 
    persist_file = link.QueryInterface (pythoncom.IID_IPersistFile) 
    persist_file.Load (filename) 
    # 
    # GetPath returns the name and a WIN32_FIND_DATA structure 
    # which we're ignoring. The parameter indicates whether 
    # shortname, UNC or the "raw path" are to be 
    # returned. Bizarrely, the docs indicate that the 
    # flags can be combined. 
    # 
    name, _ = link.GetPath (shell.SLGP_UNCPRIORITY) 

    target = name 
    target = target.replace('H:\My Music', 'D:\Users\Myself\My Music') 

    link.SetPath(target) 
    persist_file.Save(filename, 0) 

    return name 

def shell_glob (pattern): 
    for filename in glob.glob (pattern): 
    if filename.endswith (".lnk"): 
     print shortcut_target(filename) 



desktop = "H:\My Music\" 
for filename in shell_glob (os.path.join (desktop, "*")): 
    print filename