文章目录
一、背景
- 在
Windows系统
中,快捷方式
是最最常见的文件了。
(.lnk
后缀的文件,后缀可能是隐藏的) - 点击
.lnk
后缀的文件,会打开其关联的目标对象。
(目标对象可以是本地或网络程序、文件、文件夹、计算机、Internet 地址等等) - 大多数人永远都不会需要打开
.lnk
文件进行查看或编辑它。
(注意这里说的是.lnk文件本身,而不是它链接的目标文件,当然也不是在说右键>属性
查看/编辑.lnk文件属性) - 我也差点成为大多数人中的一员,直到前几天我在写一个批处理时,发现
命令提示符.lnk
快捷方式打开的dos窗口,与cmd.exe 程序
打开的dos窗口,两者窗口的属性配置竟然不一致,后者的属性配置是从注册表加载的,而前者属性配置会不会是从.lnk
文件本身读取的呢?
(如果你从没有修改过cmd.exe
或.lnk
打开的dos窗口的属性,那它们的属性配置都是默认值,都一样。这里就不细说了,感兴趣的可以看我的另一篇文章:Windows 不同方式打开的cmd/dos窗口属性配置不同)
为了探究命令提示符.lnk
文件中是否存储了dos窗口属性配置信息,于是我有了想要查看.lnk
文件内容的需求,接下来就我尝试多的几种方案做下总结。
二、查看/修改.lnk
文件内容
(温馨提示:方案1~4 都是失败的方案,方案5 才是成功的方案,你可以直接跳到 方案5)
方案1:用type命令
查看
通过type命令
在DOS窗口查看.lnk
文件内容
格式:type path_to_lnk_file
或者结合重定向将内容输出到.txt
文件中,示例:
C:\Users\cyinl>type Desktop\cmd.lnk > cmd_content.txt
总结:方案1,输出文件内容是乱码,基本没法看,更别说修改了。。。不可取
方案2:更改.lnk
文件后缀为.txt
再查看
因为多数人电脑上.lnk
后缀不显示,所以重命名改后缀的方式不太可行,
这里推荐使用cp命令
复制.lnk
文件,新文件使用.txt
后缀,示例:
C:\Users\cyinl>copy Desktop\cmd.lnk cmd_content2.txt
已复制 1 个文件。
总结:方案2,查看到的内容也是乱码,不可取。(实质上跟方案1中的重定向生成的.txt文件一样)
方案3:用记事本
或NodePad++
打开
注意:不要用 文件
>打开
的方式打开,而是直接把.lnk
文件拖到记事本或NodePad++窗口
你也可以在dos窗口,使用编辑器应用程序运行.lnk
文件,如使用notepad.exe
程序,打开.lnk
文件:
C:\Windows\System32>notepad.exe C:\users\cyinl\Desktop\cmd.lnk
总结:方案3,查看到的内容也是乱码,不可取
方案4:使用HxD hex editor
十六进制编辑器
HxD
官网下载地址:HxD hex editor
HxD 下载安装完成后,通过拖拽或文件>打开方式,打开.lnk文件
总结:方案4,以十六进制打开lnk文件,但是转换出来的文本仍有乱码,阅读性差。虽然查看及编辑lnk文件,但是一般人真编辑不来。。。不可取
方案5:使用第三方库查看或编辑
在Python的库里我体验了几个.lnk
相关的库,这里推荐两个觉得不错的。
建议可以先了解下关于.lnk
二进制文件格式的有关知识:
[MS-SHLLINK]: Shell Link (.LNK) Binary File Format
1. Matmaus/LnkParse3
库
GitHub仓库:Matmaus/LnkParse3
特点:
- 简单易用,官网文档详细;
- 解析lnk文件输出信息比较全,格式也漂亮;
- 支持cli、python package 两种使用方式;
- 但这个库仅解析lnk文件,不支持编辑或创建。
详细的介绍、安装和使用方式见官网
这里使用 python package
方式演示,cli
命令行的方式参考官网自行体验吧。
# -*- coding:utf-8 -*-
import LnkParse3
with open("C:\\Users\cyinl\Desktop\cmd.lnk","rb") as lf:
ldata = LnkParse3.lnk_file(lf)
print(ldata.get_json()) # 获取解析数据,未格式化的json格式
ldata.print_json() # 打印输出格式化后的json数据
ldata.print_lnk_file() # 打印输出文本形式的数据,也有漂亮的格式
获取.lnk
文件解析内容的方式如下:
1)get_json()
输出解析内容(无格式化)
{
'header': {
'guid': '00021401-0000-0000-C000-000000000046', 'r_link_flags': 989, 'r_file_flags': 0, 'creation_time': None, 'accessed_time': None, 'modified_time': None, 'file_size': 0, 'icon_index': 0, 'windowstyle': 'SW_SHOWNORMAL', 'hotkey': 'UNSET - UNSET {0x0000}', 'r_hotkey': 0, 'link_flags': ['HasTargetIDList', 'HasName', 'HasRelativePath', 'HasWorkingDir', 'HasIconLocation', 'IsUnicode', 'ForceNoLinkInfo', 'HasExpString'], 'file_flags': []}, 'data': {
'description': '@%windir%\\system32\\shell32.dll,-22534', 'relative_path': '..\\..\\..\\WINDOWS\\system32\\cmd.exe', 'working_directory': '%HOMEDRIVE%%HOMEPATH%', 'icon_location': '%windir%\\system32\\cmd.exe'}, 'extra': {
'SPECIAL_FOLDER_LOCATION_BLOCK': {
'size': 16, 'special_folder_id': 37, 'offset': 221}, 'KNOWN_FOLDER_LOCATION_BLOCK': {
'size': 28, 'known_folder_id': '1AC14E77-02E7-4E5D-B744-2EB1AE5198B7', 'offset': 221}, 'ENVIRONMENTAL_VARIABLES_LOCATION_BLOCK': {
'size': 788, 'target_ansi': '%windir%\\system32\\cmd.exe', 'target_unicode': '%windir%\\system32\\cmd.exe'}, 'CONSOLE_PROPERTIES_BLOCK': {
'size': 204, 'fill_attributes': 15, 'popup_fill_attributes': 181, 'screen_buffer_size_x': 110, 'screen_buffer_size_y': 6000, 'window_size_x': 110