简体   繁体   English

使用Python修改Windows快捷方式

[英]Modify Windows shortcuts using Python

How do you change a Windows shortcut using Python? 如何使用Python更改Windows快捷方式?

eg from: 例如来自:

H:\My Music\some_file.mp3

to: 至:

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

Here's another, more appropriate way to do this in Python with Winshell library: Using Python to create Windows shortcuts . 这是使用Winshell库在Python中执行此操作的另一种更合适的方法: 使用Python创建Windows快捷方式 In your case the code will look like: 在您的情况下,代码将如下所示:

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()

Existing shortcut should be deleted or rewritten. 应删除或重​​写现有快捷方式。 If you need it for batch processing of shortcut files then I think there's some way to read paths from existing shortcuts, but didn't managed to find it. 如果你需要它来批量处理快捷方式文件,那么我认为有一些方法可以从现有的快捷方式中读取路径,但是没有设法找到它。

Jonathan's solution works perfectly. Jonathan的解决方案非常有效。 This is the useful function I produced implementing this. 这是我实现这个的有用功能。 Simply pass in the name of the shortcut file (for example "Mozilla Firefox.lnk", it is unnecessary to specify the entire filepath), and the new shortcut destination, and it will be modified. 只需传入快捷方式文件的名称(例如“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)

The only dependency is the pywin32 library. 唯一的依赖是pywin32库。 Also note that one is able to specify options and arguments in their shortcut destination. 另请注意,可以在快捷方式目标中指定选项和参数。 To implement, just call: 要实现,只需调用:

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.

This example will set the destination of a shortcut on your desktop called "shortcut test" to a shortcut that opens up the file manager in the root directory of the hard drive (C:). 此示例将桌面上名为“快捷方式测试”的快捷方式的目标设置为在硬盘驱动器根目录(C :)中打开文件管理器的快捷方式。

Here is how you can create a shortcut using Windows script host: http://msdn.microsoft.com/en-us/library/fywyxt64 以下是使用Windows脚本宿主创建快捷方式的方法: http//msdn.microsoft.com/en-us/library/fywyxt64

Try to write it to file from Python and run it dynamically. 尝试从Python将其写入文件并动态运行。

Yet another method is detailed here 这里还详述另一种方法

Use the shortcut update example. 使用快捷方式更新示例。 You can shortcut.GetPath() , modify it and then use shortcut.SetPath() method to set it. 你可以使用shortcut.GetPath() ,修改它然后使用shortcut.SetPath()方法来设置它。

The previous answer are perfectly valid however to really complete them I added the code for bulk editing because I suppose you might have a lots of link to edit. 之前的答案是完全有效的,但要真正完成它们我添加了批量编辑的代码,因为我想你可能有很多链接要编辑。

use this if you want to edit many links at once: 如果要一次编辑多个链接,请使用此选项:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM