当前位置:  开发笔记 > 编程语言 > 正文

在Python中读取.lnk文件的目标?

如何解决《在Python中读取.lnk文件的目标?》经验,为你挑选了4个好方法。

我正在尝试.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"文件夹的指向.我想要它的绝对位置.



1> SaoPauloooo..:

使用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)


谢天谢地,我找到了这个!我正准备放弃并编写一个vbs脚本,并从我的python脚本中调用它。这样好多了。+1

2> gak..:

基本上直接调用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



3> Adam Rosenfi..:

或者,您可以尝试使用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



4> 小智..:

我知道这是一个较旧的线程但我觉得没有太多关于使用原始问题中提到的链接规范的方法的信息.

我的快捷方式目标实现无法使用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])

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有