Verificamos de forma completamente cada una de las reseñas en nuestra web con la meta de enseñarte siempre la información con la mayor veracidad y actual.
Solución:
Cree un acceso directo usando Python (a través de WSH)
import sys
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut("t:\test.lnk")
shortcut.Targetpath = "t:\ftemp"
shortcut.save()
Lea el objetivo de un acceso directo usando Python (a través de WSH)
import sys
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut("t:\test.lnk")
print(shortcut.Targetpath)
Sé que este es un hilo más antiguo, pero creo que no hay mucha información sobre el método que usa la especificación del enlace como se indica en la pregunta original.
Mi implementación de destino de acceso directo no podía usar el módulo win32com y después de mucho buscar, decidí crear el mío. Nada más parecía lograr lo que necesitaba bajo mis restricciones. Esperemos que esto ayude a otras personas en esta misma situación.
Utiliza la estructura binaria que Microsoft ha proporcionado para MS-SHLLINK.
import struct
path = 'myfile.txt.lnk'
target = ''
with open(path, 'rb') as stream:
content = stream.read()
# skip first 20 bytes (HeaderSize and LinkCLSID)
# read the LinkFlags structure (4 bytes)
lflags = struct.unpack('I', content[0x14:0x18])[0]
position = 0x18
# if the HasLinkTargetIDList bit is set then skip the stored IDList
# structure and header
if (lflags & 0x01) == 1:
position = struct.unpack('H', content[0x4C:0x4E])[0] + 0x4E
last_pos = position
position += 0x04
# get how long the file information is (LinkInfoSize)
length = struct.unpack('I', content[last_pos:position])[0]
# skip 12 bytes (LinkInfoHeaderSize, LinkInfoFlags, and VolumeIDOffset)
position += 0x0C
# go to the LocalBasePath position
lbpos = struct.unpack('I', content[position:position+0x04])[0]
position = last_pos + lbpos
# read the string at the given position of the determined length
size= (length + last_pos) - position - 0x02
temp = struct.unpack('c' * size, content[position:position+size])
target = ''.join([chr(ord(a)) for a in temp])
Básicamente llame a la API de Windows directamente. Aquí hay un buen ejemplo encontrado después de buscar en Google:
import os, sys
import pythoncom
from win32com.shell import shell, shellcon
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, "python.lnk")
persist_file = shortcut.QueryInterface (pythoncom.IID_IPersistFile)
persist_file.Load (shortcut_path)
shortcut.SetDescription ("Updated Python %s" % sys.version)
mydocs_path = shell.SHGetFolderPath (0, shellcon.CSIDL_PERSONAL, 0, 0)
shortcut.SetWorkingDirectory (mydocs_path)
persist_file.Save (shortcut_path, 0)
Esto es de http://timgolden.me.uk/python/win32_how_do_i/create-a-shortcut.html.
Puede buscar “python ishelllink” para ver otros ejemplos.
Además, la referencia de la API también ayuda: http://msdn.microsoft.com/en-us/library/bb774950(VS.85).aspx