使用 Python 修改 Windows 快捷方式

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6805881/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 17:33:48  来源:igfitidea点击:

Modify Windows shortcuts using Python

pythonwindowsshortcuts

提问by Jonathan

How do you change a Windows shortcut using Python?

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

e.g. from:

例如来自:

H:\My Music\some_file.mp3

to:

到:

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

回答by Hnatt

Here's another, more appropriate way to do this in Python with Winshell library: Using Python to create Windows shortcuts. In your case the code will look like:

这是在 Python 中使用 Winshell 库执行此操作的另一种更合适的方法:使用 Python 创建 Windows 快捷方式。在您的情况下,代码将如下所示:

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.

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

回答by trevorKirkby

Jonathan's solution works perfectly. 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. Also note that one is able to specify options and arguments in their shortcut destination. To implement, just call:

唯一的依赖项是 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.

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:) 根目录中的文件管理器的快捷方式。

回答by Jonathan

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()方法来设置它。

回答by Hnatt

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 写入文件并动态运行。

回答by Tom

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