您可以通过在 shell 命令行和 applescript 之间使用交叉来简化这一点。
set jpegSearch to paragraphs of (do shell script "mdfind -onlyin / 'kMDItemContentType == \"public.jpeg\" '")
mdfind命令_
查询中央元数据存储并返回与给定元数据查询匹配的文件列表。查询可以是字符串或查询表达式。
AFAIK 这就是聚光灯使用的。
mdfind文档将使您了解此命令的工作原理。但是这个脚本只在“ / ”中搜索并查找内容类型属性是public.jpeg
返回是文本。匹配文件的 POSIX 路径列表。这个文本就像一个文本文档,每个路径都在一个新的行上,但就 Applescript 而言实际上是一个项目。
它们需要在一个 applescript 列表中分解。所以我通过询问结果的段落来做到这一点。
此外,如果您想打开一个新的查找器窗口:
尝试类似:
tell application "Finder"
activate
set myWindow to make new Finder window to startup disk
end tell
回答为什么您在尝试获取文件目标的 POSIX 路径时遇到错误。
如果您查看搜索窗口中返回的文件之一的属性。
tell application "Finder" to set fileList to properties of first file of front window
您将看到文件属性有一个名为original item的属性
如果您真的想按照自己的方式进行操作,那么一种方法是获取原始项目。将结果强制转换为别名形式,然后获取 posix 路径。
tell application "Finder" to set aFile to POSIX path of (original item of first file of front window as alias)
在普通的查找器窗口中,您可以使用。
tell application "Finder" to set fileList to POSIX path of (first file of front window as alias)
这些只是向您展示正在发生的事情的示例。
查找器窗口结果类型的差异是因为在搜索窗口中显示的是原始文件的别名文件(类:别名文件),因此是原始项目属性。
更新 2。
浏览列表中的项目并对照另一个列表检查它们很简单。
Apple 有一些工具可以帮助您编写代码。
在您的脚本中时。
crtl+ 鼠标单击将 jpg 结果保存为列表的变量。
这将为您提供一个包含帮助代码的上下文菜单。转到菜单中的重复例程文件夹。
然后到它的“处理每个项目”
这将为您的代码添加一个重复例程。
从那里您可以使用它来检查每个项目与您的其他列表。
set yourOtherList to {"/Library/Desktop Pictures/Abstract/Abstract 2.jpg", "/Library/Desktop Pictures/Abstract/Abstract 1.jpg"}
set jpegSearch to paragraphs of (do shell script "mdfind -onlyin / 'kMDItemContentType == \"public.jpeg\" '")
repeat with i from 1 to number of items in jpegSearch
set this_item to item i of jpegSearch
if this_item is in yourOtherList then
-- do something
log this_item
end if
end repeat
重复例程是这样工作的。
它遍历给定列表中的每个项目
它将从项目 1 迭代到列表中项目的计数。
i变量保存循环迭代次数。即它将在第一个循环中为 1,在第 300 个循环中为 300。
所以在第一个循环 中,将 this_item 设置为 jpegSearch 的第 i 项相当于将 set this_item 写入 jpegSearch 的第 1 项
但是苹果省去了你必须用Repeat with i写每个项目的每个数字..
变量i可以是您选择的符合正常允许的变量命名语法的任何单词或字母。
您可以做的是从匹配的项目中构建一个新列表。通过将它们复制到先前声明的列表中。然后,您可以在重复循环完成后处理该列表。
这里bigList被声明为一个空列表{}
匹配的项目被复制到 bigList。它收到的每个新项目都会添加到列表的末尾。
set bigList to {}
set yourOtherList to {"/Library/Desktop Pictures/Abstract/Abstract 2.jpg", "/Library/Desktop Pictures/Abstract/Abstract 1.jpg"}
set jpegSearch to paragraphs of (do shell script "mdfind -onlyin / 'kMDItemContentType == \"public.jpeg\" '")
repeat with i from 1 to number of items in jpegSearch
set this_item to item i of jpegSearch
if this_item is in yourOtherList then
copy this_item to end of bigList
end if
end repeat
bigList