知识点:
- 操作:转换图像
- 操作:显示结果
- 操作组合:匹配多组文本其中之一
- 技巧:如何判断是否匹配到了多个结果之一
- 技巧:获取 PDF 文件的页数
- 知识点:使用「从输入中获取」类的操作
查看文件信息,是我们经常会遇到的一个需求。上周我们也留了练习,是精简一个查看照片 EXIF1 信息的捷径,这就是一个非常典型的查看文件信息的捷径。但是除了照片之外,我们还会遇到很多文件类型,比如 mp4 等视频(Video)文件、比如 PDF 等文档(Document)类文件。
面对不一样的文件,我们想要获取的信息也不尽相同:
- 图片类的可能想知道长、宽等。
- 照片的可能想知道更详细的信息,比如拍摄的位置等。
- PDF 类的可能想知道名称、页数等。
- 上述所有的类别都需要知道文件的大小。
这些列出来的需求只是我的一个简单设想,在现实中,根据每个人接触的文件类别不同,大家对不同的文件类型也有不一样的需求。
这里的问题是,如果针对每个文件类型和每个需求都只做一个捷径。那从经济的角度来说,会浪费过多可在共享菜单运行捷径的位置。从尊严上来说,这样集中的需求却不能在同一个捷径实现,显得有点蠢。
所以我们在这一节,要想办法做一个捷径同时解决不同文件类型的不同需求。
作为示例,我将在这一节简单展示 3 种不同的文件类型,以及我们针对不同文件的需求:
- 图片类文件:获取其宽、高。
- 视频类文件:获取其宽、高和时长。
- PDF 类文件:获取其名称、页数。
- 上述所有的类别:都获取文件的格式、大小。
- 最后要能做到用一个捷径批量查看多个文件
那么首先,这个捷径是要查看其它文件的信息的,这就是说它要通过共享表单来运行。那么我们就要首先在这个捷径的设置中,把它设为「在共享表单中显示」。
又因为我们这次针对的文件类型是:图片、视频、PDF 3 种,那么我们就在「接受的类型」中选择:「图像」、「媒体」和「PDF」这三样。现在这个捷径头看起来应该是这个样子:
接下来,我们就要想办法,让捷径判断不同的文件类型,再针对不同的文件类型,获取不同的信息。
重点技巧:如何判断是否匹配到了多个结果之一
我们看到的文件名,一般都分为 文件名.扩展名
的格式,比如 捷径教程.PDF
:
- 文件名是「捷径教程」:用户可以随便自定义文件名,比如改成「捷径教程 by Hum」
- 扩展名是「PDF」:用户不能随便自定义扩展名,有可能会导致无法打开文件的情况。
- 分隔符是「.」:一般是文件名和扩展名之间的一个半角点号。
其中,扩展名是决定文件格式的关键。常见的格式有:
- 图片: 「jpg(jpeg)」、「png」 等
- 视频:「mp4」、「mov」等
- 压缩包:「Zip」、「rar」等
我们要让捷径处理不同类型的文件,就要让捷径从这些扩展名下手。所以我们最开始,就要使用「获取文件的详细信息」,它可以帮助我们获取「文件扩展名」:
在「获取文件的详细信息」下的「获取」中选择「文件扩展名」后,我们就知道了我们每次获取的文件的扩展名是什么。
现在我们要根据不同的扩展名,对不同的文件类型获取不同的信息。很容易想到要用「如果」这个操作。逻辑大概是:
如果上一步的文件扩展名是图片类型的,那我们就获取它的宽和高;否则它就有可能是视频或者 PDF。如果扩展名是视频类型的,那么就获取它的宽、高还有时长;否则它既不是图片也不是视频,就只剩下 PDF 了,那我们就获取它的标题和页数。
这样的 3 层关系,一般都需要使用 2 层「如果」操作来解决。我们先用第 1 个「如果」,来解决第一层条件,判断图片的扩展名,来作为示例。
我们以 jpg
、jpeg
、png
3 个格式为例,来讲一下如何根据扩展名来分类文件。
我们假设如果扩展名是 jpg
、jpeg
、png
这 3 者其中之一,我们就认为它是一张图片。
那么在捷径里,我们应该在「如果」操作里,用「等于」来匹配这个扩展名。也就是说,当我们想查看文件的扩展名等于 jpg
、jpeg
、png
三者之一,那么它就是图片:
但是我们看「如果」这个操作,选择「等于」之后发现不能用它实现匹配 3 个不同的扩展名,只能一个一个来。那么我们应该怎么解决这个问题?
在这里我们要用到上周在《条件相关的操作》中提过的重要技巧——输入判断。
我们目前的逻辑是,只要匹配到 jpg
、jpeg
、png
三者之一,就符合要求。那么首先,我们可以用正则表达式,来判断文件的扩展名,是否为三者之一。方法如下:
我们在「获取文件的详细信息」之下接上「匹配文本」,然后在其中填入正则表达式jpg|jpeg|png
,而且要关闭「区分大小写」后面的开关。这一段正则表达式的作用,就是来匹配前一步传入的文件扩展名中,有没有 jpg
、jpeg
、png
三者之一。而关掉「区分大小写」后的开关是因为有时候文件扩展名部分大小写,jpg
和 JPG
相信大家都见过,如果没有关掉「区分大小写」的开关,捷径会认为 jpg
是图片而 JPG
不是。所以一定要关掉「区分大小写」后的开关。
接下来,我们接上「计数」这个操作。因为如果「匹配文本」匹配到了三者之一,那么就会有 1 项结果传下来,所以我们用「计数」,来获取上一步的结果的项数。
再接下来,我们接上「如果」,如果上一步传进来的结果的项数等于 1,那么就可以说明,我们匹配到了 jpg
、jpeg
、png
三者之一。
匹配到了三者之一,意味着我们匹配到了图片,那么接下来,只要来获取图片的宽和高即可。相比之下,获取宽和高可简单得多啦。
知识点:使用「从输入中获取」类的操作
其实在捷径中,有一套动作可以帮助我们直接从上一步的结果中获取我们想要的文件类型。它们统一以「从输入中获取」开头,有:
- 从输入中获取联系人
- 从输入中获取电子邮箱地址
- 从输入中获取日期
- 从输入中获取 URL
- 从输入中获取图像
- ……
这一系列动作是将复杂的格式匹配合为一个简单直观的动作,以供我们使用,非常贴心。
其中倒数第二项就是「从输入中获取图像」,它其实是可以代替我们那套匹配后缀名的操作组合,直接获取图像。而且过程也会变得更加简短和容易理解。
但是,不知出于什么原因,捷径把 mp4
这个文件类型也归为了图片,不太符合我们正常的认知,也不太符合我们这个捷径的目的(我们要查看视频的时长)。而 mov
这个类型,捷径又正常地归为了视频。
所以简单来说,如果我们想把 mov
和 mp4
分到「视频」一类,把 jpg
和 png
分到「图片」一类,使用「从输入中获取图像」这个操作反而会让事情更麻烦。
图片类文件获取宽和高
我们已经解决了如何根据扩展名来判断文件类型了,接下来我们就来看不同的类型,如何获取它们独特的数据。
首先是图片类文件,我们要获取它的宽和高。这对于大家来说是非常容易的,为了提高一点难度,我们使用魔法变量来实现它:
我们直接在「如果」这个操作之下放文本,因为「如果」内的条件设定是「等于 1」。这时如果满足了这个条件,就说明我们获取的是图片,那么我们就可以直接获取图片的宽和高。
宽和高用魔法变量很好实现也很省步骤,只要选择「捷径输入」,就会发现它会提供一个菜单,里面已经有了「宽(Width)」和「高(Height)」:
到了这里,我们已经解决了「当我们针对一个图片运行这个捷径,便获取它宽和高」这个需求了:
接下来我们来看视频类文件的部分。
视频类文件获取宽、高和时长
首先我们要放在脑子里的是,匹配视频类文件是在没有匹配到图片类文件之后采取的措施。在捷径中,它是第一个「否则」后的事情。所以我们关于视频类文件的操作,是在「否则」之后开始的。
从输入的文件中匹配出视频类文件的方法和匹配出图片的方法一样。也是根据捷径输入文件的扩展名,来匹配 mp4
或 mov
这两个苹果平台上比较常见的视频格式。所以方法也是一样,要用到「匹配文本」、「计数」和「如果」这三者组成的操作组合。
但是,我们不能忘了先获取捷径传入的文件,这一步要靠「获取变量」来实现。在「获取变量」这一步,我们选择魔法变量后,把界面拉到最顶部,就可以选择「捷径输入」,这时候,我们顺手,选择弹出菜单中的「获取文件扩展名」,就又可以省下几个操作。
接下来,我们就可以在下面接上刚才那个「匹配文本」、「计数」和「如果」的操作组合了:
这次匹配文本中的「模式」要填 mp4|mov
,同样要关闭区分大小写。其它的和匹配图片的方法一样。
随后,在「如果」之后,我们一样接上「文本」操作,一样在其中填上获取宽和高的魔法变量:
获取时长的方法和获取宽、高的方法一样,只要把菜单放下翻一翻就能找到。它在捷径中的说法是「持续时间(Duration)」。
在解决了视频类文件的判断和获取数据之后,我们来解决最后的 PDF 类文件。
PDF 类文件获取标题和页数
获取 PDF 文件的信息作为我们这个捷径的最后一环,在逻辑上也是最后一项。当我们获取的文件不是图片、也不是视频时,它就只剩下 PDF 这一种可能了。这是因为我们最初设定这个捷径只接收这 3 个类型的文件:
所以我们不用再加入针对 PDF 的扩展名判断,只要接着视频判断部分那个「如果」后的「否则」开始接下来的操作即可。
既然不用再判断了,那我们应该可以直接在这一步加上「文本」,直接用魔法变量把剩下的事搞定。
尝试一下,我们毫不意外地获取了「捷径输入」的「标题(Name)」:
但是这个过程有点不同,我们在这里选择「捷径输入」时,要选一下「捷径输入」作为什么东西。一直以来它默认的是「作为照片媒体」:
但是实际上我们这里接收了 3 种不同的文件类型,这里我们要用的是 PDF,所以在这一步,要把它改为 PDF:
但是这时候我们会发现,魔法变量没办法帮我们获取 PDF 的页数。那我们该怎么办?
技巧:如何查看 PDF 文件的页数?
在捷径中,我们可以通过「转换图像」这个操作,把 1 个 PDF 文件转化成多个图片文件的集合。这样,PDF 文件的页数,实际上就转化成了图片文件的个数。而统计个数我们已经很擅长了,就是使用「计数」这个操作:
像这样,首先我们要用到「获取变量」,因为我们还是要针对「捷径输入」进来的 PDF 进行接下来的操作。
随后接「转换图像」,其中的格式、质量和源数据都不重要,因为我们只是为了知道有几张图片。
转换完后,使用「计数」,获取「项目」的个数。并在最后为其「设定变量」,变量名我这里写的是 PDF 页数
。
获取了 PDF 页数之后,我们把它也放在之前做过的「文本」之中,PDF 这部分的判断和信息获取就也解决了。
在最后加上共通的文件大小信息
在需求中我们还有一项,就是针对上述所有的文件类别,都要获取它们的格式和大小。因为它是共通的,所以根据我们在第一周就已经学过的合并同类项的思路,我们把这一步拖到最外面来做。
首先我们这次用个新的操作「显示结果」,它也是捷径显示最终结果的方式之一,也是唯一可以让 Siri 念出来的展示结果的方式。对于文本类的结果,都可以用它来展示。
「显示结果」中有个 如果的结果
,这是个魔法变量,它会出现在你键盘的快速输入栏中。它是我们之前设计的逻辑结构的结果:如果我们选择运行捷径的文件是一张图片,那么这个结果就会是那张图片的宽和高;如果运行捷径的文件是视频,那么这个结果就会是宽、高和时长,以此类推。
剩下的 文件大小
和 文件格式
的获取方法大家已经很熟悉了,使用魔法变量后选择弹出菜单中相应的选项即可。
批量获取文件信息
到此为止,我们已经做好了一个可以针对单个文件快速查看其信息的捷径了。但是我们最终的目的是选择多个文件,挨个查看其信息。
这时候,「重复」这两个字又该出现在你的脑子里了。而且你应该直觉地感受到,这里应该用的是排查型的重复操作「为每个项目重复」。
「为每个项目重复」这个操作要包住刚才所做的完整的操作列表。因为我们要针对捷径通过分享表单传入的多个文件,一个一个地查看它们的信息。被重复的是传入的多个文件,而不是已有的任何步骤。
但是这并没有结束。如果这时候你选择多个不同格式的文件运行捷径,会发现结果一塌糊涂。
这是因为我们之前获取的魔法变量全都是「捷径输入」,是「捷径输入」的宽、「捷径输入」的高、「捷径输入」的时长等。但是在针对多个文件运行时候,「捷径输入」是很多项,所以我们在这里要把它改为 1 项,被重复的这 1 项,也就是「重复项目」。
所以首先,我们要把之前所有的「捷径输入」,都改为「重复项目」,并且文件细节选择也要一致。比如说之前是「捷径输入(Width)」,那之后要改为「重复项目(Width)」。
最后的「显示结果」这个操作也需要进行一下微调。因为这一次是多个文件批量查看元素,我们想知道我们这次查看的是第几个,所以要用到「重复索引」:
我们把文件格式给换成这样一句话:
第 「重复索引」 个文件为 「重复项目(File Extension)」 文件
并把它放到开头。这样每次运行后弹出的结果将会告诉我们这是第几个查看信息的文件,并且会告诉我们它的文件格式,好让我们知道现在在看的信息是哪个文件的。
最后,我们来看一下完整的捷径以及效果展示。
捷径效果展示
成品捷径下载:查看文件信息
练习一:利用「匹配多组文本其中之一」这个操作组合,做一个解压缩捷径,让它能够遇到 zip
、rar
这两种文件时,通过共享表单运行捷径进行解压,如果通过共享表单运行捷径的文件不是这两个文件格式,则弹出提示告知使用者他选择的不是有效的压缩包文件。
提示:解压缩需要用到「从归档中提取」这个操作,弹出提示可以使用「显示通知」、「显示提醒」、「显示结果」等操作。
练习二(开放题):优化「查看文件信息」这个捷径,让它的数据更加完善。比如可以把视频的分辨率和 720P、1080P、4K、5K 之类的标准进行对比,然后在捷径运行后显示。
- 1可交换图像文件格式(英语:Exchangeable image file format,官方簡稱Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。——引自维基百科