Изменить ярлыки Windows с помощью Python - PullRequest
8 голосов
/ 24 июля 2011

Как изменить ярлык Windows с помощью Python?

, например, с:

H:\My Music\some_file.mp3

на:

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

Ответы [ 5 ]

7 голосов
/ 24 июля 2011

Вот еще один, более подходящий способ сделать это в 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()

Существующий ярлык должен быть удален или переписан. Если вам это нужно для пакетной обработки файлов ярлыков, я думаю, что есть какой-то способ прочитать пути из существующих ярлыков, но найти его не удалось.

4 голосов
/ 27 марта 2014

Решение Джонатана работает отлично.Это полезная функция, которую я создал, реализуя это.Просто введите имя файла ярлыка (например, «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:)

.
2 голосов
/ 01 августа 2011

Еще один метод подробно описан здесь

Используйте пример обновления ярлыка.Вы можете shortcut.GetPath(), изменить его, а затем использовать метод shortcut.SetPath() для его установки.

2 голосов
/ 24 июля 2011

Вот как вы можете создать ярлык, используя хост скрипта Windows: http://msdn.microsoft.com/en-us/library/fywyxt64

Попробуйте записать его в файл из Python и запустить его динамически.

0 голосов
/ 23 января 2018

Предыдущий ответ совершенно действителен, однако, чтобы действительно завершить его, я добавил код для массового редактирования, потому что, я полагаю, у вас может быть много ссылок для редактирования.

используйте это, если вы хотите редактировать много ссылок одновременно:

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
...