我正在尝试.lnk
从Python 读取一个shortcut()文件的目标文件/目录.是否有一种无头痛的方法呢?该.LNK规范[PDF]是在我头上的方式.我不介意使用仅限Windows的API.
我的最终目标是"(My) Videos"
在Windows XP和Vista上找到该文件夹.在XP上,默认情况下,它%HOMEPATH%\My Documents\My Videos
在Vista 上,在Vista上%HOMEPATH%\Videos
.但是,用户可以重新定位此文件夹.在这种情况下,%HOMEPATH%\Videos
文件夹不再存在,并被替换%HOMEPATH%\Videos.lnk
为新"My Videos"
文件夹的指向.我想要它的绝对位置.
使用Python创建快捷方式(通过WSH)
import sys import win32com.client shell = win32com.client.Dispatch("WScript.Shell") shortcut = shell.CreateShortCut("t:\\test.lnk") shortcut.Targetpath = "t:\\ftemp" shortcut.save()
使用Python读取快捷方式的目标(通过WSH)
import sys import win32com.client shell = win32com.client.Dispatch("WScript.Shell") shortcut = shell.CreateShortCut("t:\\test.lnk") print(shortcut.Targetpath)
基本上直接调用Windows API.以下是谷歌搜索后发现的一个很好的例子:
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)
这是来自http://timgolden.me.uk/python/win32_how_do_i/create-a-shortcut.html.
您可以搜索"python ishelllink"以获取其他示例.
此外,API参考也有帮助:http://msdn.microsoft.com/en-us/library/bb774950(VS.85).aspx
或者,您可以尝试使用SHGetFolderPath().以下代码可能有效,但我现在不在Windows机器上,所以我无法测试它.
import ctypes shell32 = ctypes.windll.shell32 # allocate MAX_PATH bytes in buffer video_folder_path = ctypes.create_string_buffer(260) # 0xE is CSIDL_MYVIDEO # 0 is SHGFP_TYPE_CURRENT # If you want a Unicode path, use SHGetFolderPathW instead if shell32.SHGetFolderPathA(None, 0xE, None, 0, video_folder_path) >= 0: # success, video_folder_path now contains the correct path else: # error
我知道这是一个较旧的线程但我觉得没有太多关于使用原始问题中提到的链接规范的方法的信息.
我的快捷方式目标实现无法使用win32com模块,经过大量搜索,我决定拿出自己的.在我的限制下,似乎没有其他任何东西可以实现我的需要.希望这将有助于其他人在同样的情况下.
它使用Microsoft为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])