使用python在windows系统操作快捷方式
其实问题是由上一篇文章(https://www.cnblogs.com/anpengapple/p/18179353)的结尾引出来的。不需要了解背景的话,我现在需要做的是,右键打开桌面上的chrome快捷方式的属性,在目标的后面增加一个参数。我不想傻傻地手动添加,想交给程序来处理。
首先需要简单来说一下,windows的快捷方式是就是.lnk文件,这是一种二进制文件格式,内容很简单,大概就是从文件头中,偏移多少个字节,可以取到一段内容,表示这个快捷方式的某一种属性(目标或者参数等等),我们要创建快捷方式或者编辑快捷方式,就是在操作这段偏移量的内容。
从微软的官网我们可以学习一下LNK格式文件的一些知识:
或者也可以看看这篇文章有个直观的印象LNK文件的结构:
说到这里要跑题一句,以后要小心哦!别人分享给你的lnk文件,是可以伪装的,在这个文件头中可以插入恶意代码,还可以更改图标。比如你闺蜜告诉你说,“听说了没,某某最近那个惊天大瓜!”然后顺手给你发个pdf,看起来是个正经(嗯?)的pdf,但有可能是个lnk文件,里面塞了个木马,种在你的电脑里了,顺手再从远程下载一个真正的pdf。防不胜防啊!
好,扯回正题。我肯定是不会去直接操作二进制文件的,太困难。
那么第三方库选择什么呢?按照查到的顺序,我先尝试了pylnk。在网上查到几篇,但是一尝试就发现,文章都是假的,因为pylnk这个库只能用于python2,在python3环境下甚至无法安装。
看这发布日期,真的假的?2024年还在用python2?呵呵,要说这不是爬虫爬来的文章,我可不太信。
好消息是,这个库有对应的python3版本——pylnk3(而且是仅限python3使用),在使用方法上也比pylnk更现代一些。可以参考一下这篇文章:
(直接看方案5即可)
但我当时没有看这篇文章,就自己看了一下pylnk3库的源码,就开始自己瞎捣鼓了一下。其实也很简单,大概就几步:
from pylnk3 import Lnk lnk_path = os.path.join(os.path.abspath(os.path.expanduser("~")), "Desktop\\chrome.lnk") with open(lnk_path, "rb") as fdata: lnk = Lnk(fdata) lnk.arguments = "--remote-debugging-port=9527" lnk.save()
我太想当然了,我验证了一下代码结果,快捷方式根本打不开了。
查了一下,大概意思是我还要设置别的东西,target, window_mode, working_dir什么的。可是其他内容我并不想改啊,为什么还要重新设置一遍?干脆不用了。如果考虑读快捷方式的某些属性,这个库应该还蛮简便的吧。但是要写,还是有点风险的。
类似的库有个LnkParse3,但我没有尝试,直接考虑调用windows shell。
在网上看到一个winshell模块,pip安装失败,报错“No module named win32con”,然而搜索win32con这个模块就一无所获(真的不是winshell的作者把模块名字写错了吗?)。算了,不如直接一点,用win32com。安装轻松,代码简单,方便快捷,是居家旅行必备佳品分分钟搞定。
from win32com.client import Dispatch # 调用shell shell = Dispatch("WScript.Shell") # lnk文件位置 lnkpath = os.path.abspath(os.path.join(os.path.expanduser("~"), "Desktop\\Google Chrome.lnk")) # 如果lnk不存在,会创建新的 t = shell.CreateShortCut(lnkpath) # 设置lnk的目标地址,可以不写。但如果创建新的快捷方式就必须写了 # t.TargetPath = os.path.abspath(os.path.join(os.path.expanduser("~"), "AppData\\Local\\Google\\Chrome\\Application\\chrome.exe")) # 设置lnk的参数 t.Arguments = "--remote-debugging-port=9527" # 保存 t.Save()
废话半天,其实就只有最后这几行有用。其实也是我的需求比较少,shell对快捷方式的操作种类也挺丰富的,等将来有心情再玩玩看。
本文原创自博客园文章,想了解python相关技巧,欢迎到我的博客踩踩~
地址:http://www.cnblogs.com/anpengapple/