在 Python 中读取 .lnk 文件的目标?
我正在尝试从 Python 读取快捷方式 (.lnk
) 文件的目标文件/目录。 有没有一种不让人头疼的方法呢? 该规格超出了我的能力范围。 我不介意使用仅限 Windows 的 API。
我的最终目标是在 Windows XP 和 Vista 上找到“(我的)视频”
文件夹。 在 XP 上,默认情况下,它位于 %HOMEPATH%\My Documents\My Videos
,在 Vista 上,它位于 %HOMEPATH%\Videos
。 但是,用户可以重新定位该文件夹。 在这种情况下,%HOMEPATH%\Videos
文件夹不再存在,并被 %HOMEPATH%\Videos.lnk
取代,该文件夹指向新的“我的视频” ” 文件夹。 我想要它的绝对位置。
I'm trying to read the target file/directory of a shortcut (.lnk
) file from Python. Is there a headache-free way to do it? The spec is way over my head.
I don't mind using Windows-only APIs.
My ultimate goal is to find the "(My) Videos"
folder on Windows XP and Vista. On XP, by default, it's at %HOMEPATH%\My Documents\My Videos
, and on Vista it's %HOMEPATH%\Videos
. However, the user can relocate this folder. In the case, the %HOMEPATH%\Videos
folder ceases to exists and is replaced by %HOMEPATH%\Videos.lnk
which points to the new "My Videos"
folder. And I want its absolute location.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
使用 Python 创建快捷方式(通过 WSH)
使用 Python 读取快捷方式的目标(通过 WSH)
Create a shortcut using Python (via WSH)
Read the Target of a Shortcut using Python (via WSH)
我知道这是一个较旧的线程,但我觉得关于使用原始问题中所述的链接规范的方法没有太多信息。
我的快捷方式目标实现无法使用 win32com 模块,经过大量搜索后,决定提出我自己的。 在我的限制下,似乎没有其他东西可以完成我所需要的事情。 希望这能帮助处于同样情况的其他人。
它使用 Microsoft 为 MS-SHLLINK 提供的二进制结构。
I know this is an older thread but I feel that there isn't much information on the method that uses the link specification as noted in the original question.
My shortcut target implementation could not use the win32com module and after a lot of searching, decided to come up with my own. Nothing else seemed to accomplish what I needed under my restrictions. Hopefully this will help other folks in this same situation.
It uses the binary structure Microsoft has provided for MS-SHLLINK.
或者,您可以尝试使用 SHGetFolderPath()。 以下代码可能有效,但我现在不在 Windows 计算机上,因此无法测试它。
Alternatively, you could try using SHGetFolderPath(). The following code might work, but I'm not on a Windows machine right now so I can't test it.
基本上直接调用Windows API。 这是谷歌搜索后发现的一个很好的例子:
这来自 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
Basically call the Windows API directly. Here is a good example found after Googling:
This is from http://timgolden.me.uk/python/win32_how_do_i/create-a-shortcut.html.
You can search for "python ishelllink" for other examples.
Also, the API reference helps too: http://msdn.microsoft.com/en-us/library/bb774950(VS.85).aspx
我也意识到这个问题很老了,但我发现答案与我的情况最相关。
就像 Jared 的回答一样,我也无法使用 win32com 模块。 因此,Jared 使用 MS-SHLLINK 中的二进制结构让我成为了一部分那里的路。 我需要在 Windows 和 Linux 上读取快捷方式,其中快捷方式是由 Windows 在 samba 共享上创建的。 Jared 的实现对我来说不太有效,我想这只是因为我遇到了快捷方式格式的一些不同变体。 但是,它给了我所需的开始(感谢贾里德)。
因此,这里有一个名为 MSShortcut 的类,它扩展了 Jared 的方法。 然而,实现仅限于Python3.4及以上版本,由于使用了Python3.4中添加的一些pathlib功能,
我希望这对其他人也有帮助。
谢谢
I also realize this question is old, but I found the answers to be most relevant to my situation.
Like Jared's answer, I also could not use the win32com module. So Jared's use of the binary structure from MS-SHLLINK got me part of the way there. I needed read shortcuts on both Windows and Linux, where the shortcuts are created on a samba share by Windows. Jared's implementation didn't quite work for me, I think only because I encountered some different variations on the shortcut format. But, it gave me the start I needed (thanks Jared).
So, here is a class named MSShortcut which expands on Jared's approach. However, the implementation is only Python3.4 and above, due to using some pathlib features added in Python3.4
I hope this helps others as well.
Thanks
我真的不喜欢任何可用的答案,因为我不想继续导入越来越多的库,并且“shell”选项在我的测试机器上不稳定。 我选择读取“.lnk”,然后使用正则表达式读出路径。 出于我的目的,我正在查找最近打开的 pdf 文件,然后阅读这些文件的内容:
注释:
显然这适用于
pdf
但需要相应地指定其他文件扩展名。I didn't really like any of the answers available because I didn't want to keep importing more and more libraries and the 'shell' option was spotty on my test machines. I opted for reading the ".lnk" in and then using a regular expression to read out the path. For my purposes, I am looking for pdf files that were recently opened and then reading the content of those files:
Comments:
Obviously this works for
pdf
but needs to specify other file extensions accordingly.python中更稳定的解决方案,使用powershell从.lnk文件中读取目标路径。
(你可以删除 -> typehinting 以使其在较旧的 python 版本中工作)
我确实注意到在大量快捷方式上运行时这很慢。 您可以使用 jareds 方法,检查结果是否为 None,如果是,则运行此代码以获取目标路径。
A more stable solution in python, using powershell to read the target path from the .lnk file.
(you can remove -> typehinting to get it to work in older python versions)
I did notice this is slow when running on lots of shortcuts. You could use jareds method, check if the result is None, and if so, run this code to get the target path.
在我的例子中,直接基于正则表达式的解析的好方法(在答案中提出)对于所有快捷方式来说并不可靠。 。 其中一些只有相对路径,例如
..\\..\\..\\..\\..\\..\\Program Files\\ImageGlass\\ImageGlass.exe
(由 msi-installer 生成),并且它以宽字符存储,这在 Python 中处理起来很棘手。所以我发现了一个Python模块LnkParse3,它很容易使用并且满足我的需求。
下面是一个示例脚本,用于显示作为第一个参数传递的 lnk 文件的目标:
The nice approach with direct regex-based parsing (proposed in the answer) didn't work reliable for all shortcuts in my case. Some of them have only relative path like
..\\..\\..\\..\\..\\..\\Program Files\\ImageGlass\\ImageGlass.exe
(produced by msi-installer), and it is stored with wide chars, which are tricky to handle in Python.So I've discovered a Python module LnkParse3, which is easy to use and meets my needs.
Here is a sample script to show target of a lnk-file passed as first argument:
我到达这个线程寻找一种方法来解析“.lnk”文件并获取目标文件名。
我找到了另一个非常简单的解决方案:
然后
基于这个很好的答案......
https://stackoverflow.com/a/43856809/2992810
I arrived at this thread looking for a way to parse a ".lnk" file and get the target file name.
I found another very simple solution:
Then
Based on this great answer...
https://stackoverflow.com/a/43856809/2992810
简单但缓慢:
Simple but slow:
就像打开“.exe”文件一样简单。 同样,我们将为此使用 os 模块。 您只需创建一个快捷方式
.lnk
并将其存储在您选择的任何文件夹中。 然后,在任何Python文件中,首先导入os
模块(已经安装,只需导入)。 然后,使用一个变量(例如path
),并为其分配一个包含.lnk
文件位置的字符串值。 只需创建所需应用程序的快捷方式即可。 最后,我们将使用 os.startfile()打开我们的快捷方式。
需要记住的要点:
现在,您已经完成了该过程。 我希望它对你有帮助。 为了获得更多帮助,我将我的代码留在底部。
在我的代码中,我使用
path
作为变量,并为 OneNote 创建了快捷方式。 在path中,我定义了OneNote快捷方式的位置。 因此,当我使用 os.startfile(path) 时,os 模块将打开变量路径中定义的快捷方式文件。It's easy as opening ".exe" file. Here also, we are going to use the
os
module for this. You just have to create a shortcut.lnk
and store it in any folder of your choice. Then, in any Python file, first import theos
module (already installed, just import). Then, use a variable, saypath
, and assign it a string value containing the location of your.lnk
file. Just create a shortcut of your desired application. At last, we will useos.startfile()
to open our shortcut.
Points to remember:
Now, you have completed the procedure. I hope it helps you. For additional assistance, I am leaving my code for this at the bottom.
In my code, I used
path
as variable and I had created a shortcut for OneNote. In path, I defined the location of OneNote's shortcut. So when I useos.startfile(path)
, theos
module is going to open my shortcut file defined in variable path.这项工作无需任何模块即可完成,执行此操作将返回具有快捷方式文件目标的 ab 字符串。 基本上,您所做的是以读取二进制模式(
rb
模式)打开文件。 这是完成此任务的代码:我目前使用的是 python 3.9.2,如果您遇到此问题,请告诉我,我会尽力修复它。
this job is possible without any modules, doing this will return a b string having the destination of the shortcut file. Basically what you do is you open the file in read binary mode (
rb
mode). This is the code to accomplish this task:i am currently using python 3.9.2, in case you face problems with this, just tell me and i will try to fix it.