在本系列第一篇文章中,我们已分析过如何快速修改单个文件的打开方式。不过,就像整理文件时一样,仅仅强调重命名的原则和方法,恐怕没有什么用,毕竟一个人不可能只占有两只手数得过来的一点点文件,相反,我们往往已经有成百上千亟待整理的东西,倘若一个一个重命名,估计所有的方法论都会在在重担之下沦为笑话:谁都知道说得没错,但谁都做不到。当然,我们早就有了批量重命名工具,别说那些价格不菲的第三方软件和各显神通的自动化方案,系统本身也有不错的批量重命名机制。
类似的,如果每次下载新文件都要手动设置打开方式,恐怕就没有人乐意继续讨论这方面的话题了。万幸,打开方式同样可以批量设置。单纯从单个操作推演到批量操作,本恐难成文,只是此次所用的核心代码为一段 AppleScript 脚本,而我在过往杂文中又动辄滥开“可以移植到你喜欢的自动化工具”这张空头支票,于是此番也详细展示如何让 AppleScript 代码适配几款不同的常见自动化工具。
Shortcuts 版的设置方式
在如今的 macOS 自动化生态中,Shortcuts 应是最常见的入门工具,原生、免费、差不多能用(尽管 bug 一堆)。更关键的是,它可以当成 AppleScript 或其他常见脚本的容器,不一定最方便、最高效,但自动化社区中的常见脚本,Shortcuts 基本都能跑。
虽说是套壳,但也讲究技巧,Shortcuts 中的代码和 LaunchBar 就有所差异,即便不懂其中的技术细节,最好也保存一下各个自动化工具的常见套壳代码模板,以便照葫芦画瓢。本文所用的 Shortcuts 代码如下:
on run {input, parameters}
repeat with thePath in input
set newPath to POSIX path of thePath
set newAlias to POSIX file newPath as alias
tell application "System Events" to set default application of newAlias to alias "/Applications/Marked 2.app"
end repeat
end run
on run
是 Shortcuts 和下一节的 Automator 最常用的 AppleScript 文件处理代码格式,理论上可以同时携带待处理文件的路径(可以是复数)和其他参数,不过一般用不到后者,起码我尽可能避免把事情弄得复杂。接下来是一组 repeat
和 end repeat
夹起来的内容,用于逐个处理输入的文件,以实现批量操作,而像三明治馅料一样夹在其中的则是核心代码。其中的 /Applications/Marked 2.app
是我用于打开部分 Markdown 的软件,你只需将其换作其他软件的路径,就能指定特定的打开方式。
惟需注意,AppleScript 代码和 Shell 或 Python 不同,你肯定已经发现,上一篇的代码非常简洁,但本节代码何以多出来 set newPath to POSIX path of thePath
和 set newAlias to POSIX file newPath as alias
两行?这是因为 AppleScript 所收到的文件路径并非标准格式,AppleScript 不能直接处理——不要问我为何有这么愚蠢的设计——还需经过层层转换,最终给出正常的文件路径。网上也有各种写法,但我发现两次转换最保险,或许有冗余,但好过出错。
纵是套壳,也要套得稳固,除了代码本身,也要注意 Shortcuts 模块和动作设置中的细节。本动作应作为 Quick Action 使用,以便从右键上下文菜单中运行,而接受的数据则是 Shortcuts Input。AppleScript 设置其实较之 Shell 脚本更为简单,在后一种情形下,还需区分标准输入和参数传入,不过本文只讨论 AppleScript,暂不涉及这部分内容。
Automator 版的设置方式
虽说被抛弃只是时间问题,但较之 Shortcuts,Automator 毕竟更加成熟,如果要干重活,我更建议使用后者。好在 Shortcuts 和 Automator 几乎一脉相承,运行 AppleScript 的模块更是几无二致,我们可以将 Shortcuts 版的代码直接粘贴到 Automator 中。
这是一个有利的信号,意味着过去将近二十年里的 Automator 自动化资源,但凡核心是脚本,就有可能移植到 Shortcuts 中。诸如提取网页链接等古老的话题,Automator 用户早已经写出了成熟的脚本,结果导致刚刚从 Shortcuts 开始接触自动化的人误以为这些领域无人开垦。其实,当你搜索 Shortcuts 目标功能
而无果时,不妨转而试试 Automator 目标功能
,说不定就能看到有十几年历史的成熟方案——当然,翻新一下,很可能就可以用在 Shortcuts 上。
LaunchBar 版的设置方式
作为一款比较小众的自动化工具——在 Twitter 上,LaunchBar 的 follower 竟然比我还少,足见其冷门——LaunchBar 在自动化领域中一直比较尴尬:它完全使用脚本,理应可以向下兼容(无意褒贬)其他自动化工具,但现实很骨干,其代码并不像 Shortcuts 和 Automator 那样可以随意互换。阅读 LaunchBar 的参考文档即可发现,其有自己的规则,虽然也有 on run
开头的写法,但并不适用于文件批量处理。真正有效的代码是:
on open (thePaths)
repeat with thePath in thePaths
set newPath to POSIX path of thePath
set newAlias to POSIX file newPath as alias
tell application "System Events" to set default application of newAlias to alias "/Applications/Marked 2.app"
end repeat
end open
除了开头和结尾,其余部分实则与 Shortcuts 版和 Automator 版无异,这便是代码套壳的应有之意。
余论
知名设计师帕帕奈克有一个“邪恶公司”的思想实验,即提出一些在道德上可以被贬入地狱的创业想法,旨在引以为戒,讽刺的是,这些想法几乎全被实施,而且你很可能已经听说过它们——比如,性爱娃娃——而根本不知道帕帕奈克是何许人也。
或许,翻新自动化脚本也会变成有利可图的产业。若有人愿意无脑翻新各大国外社区中的 Automator 动作为 Shortcuts 版,搞不好也能从蚊子腿里剔出肉来。其实,我的开源作品已经屡遭毒手,吾辈这等名不见经传的人尚遭此对待,更不用说那些名声在外的老玩家了。
那么,在此教授翻新移植之方,是否会催生或助长“邪恶公司”?或许会,但比起层层设防,或许技能自由才是更有效的防线,唯移植自动化动作变成一种不值一提的雕虫小技之日,或许 copy cat 也就自行消亡了。