Applescript:获取文件中项目的绝对路径>;开窗

Applescript:获取文件中项目的绝对路径>;开窗,applescript,posix,absolute,finder,Applescript,Posix,Absolute,Finder,我正在尝试自动化JPEGmini,这不是完全可以编写脚本的——控制它的唯一方法是通过“打开”对话框 每个图像重复调用一次是非常慢的 相反,我尝试在“打开”对话框中搜索.jpg或.jpeg文件,以便在该结果集中,我可以选择要处理的一批文件,并一次性打开它们 (代码示例之后有更多详细信息) 完成上述操作后,我如何访问搜索结果列表,重复每个项目并获取其绝对文件路径 我尝试了一些变化,但没有取得任何进展 谢谢您的时间。您可以通过使用shell命令行和applescript之间的交叉来简化此过程 set

我正在尝试自动化JPEGmini,这不是完全可以编写脚本的——控制它的唯一方法是通过“打开”对话框

每个图像重复调用一次是非常慢的

相反,我尝试在“打开”对话框中搜索.jpg或.jpeg文件,以便在该结果集中,我可以选择要处理的一批文件,并一次性打开它们

(代码示例之后有更多详细信息)

完成上述操作后,我如何访问搜索结果列表,重复每个项目并获取其绝对文件路径

我尝试了一些变化,但没有取得任何进展


谢谢您的时间。

您可以通过使用shell命令行和applescript之间的交叉来简化此过程

set jpegSearch to paragraphs of (do shell script "mdfind -onlyin / 'kMDItemContentType == \"public.jpeg\" '")
命令

查阅中央元数据存储并返回一个列表 与给定元数据查询匹配的文件数。查询可以是字符串 或查询表达式

好了,这就是聚光灯的用途

文档将使您了解该命令的工作原理。但是该脚本只在“/”中搜索,并查找内容类型属性,该属性是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
您将看到文件属性有一个名为原始项的属性

如果你真的想按你现在的方式来做,那么一种方法就是获取原始项目。将结果强制转换为别名形式,然后获取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)
这些只是一些例子来告诉你发生了什么

查找器窗口结果类型的差异是因为在搜索窗口中显示的是原始文件的别名文件(类:alias file),因此是原始项属性

更新2

浏览列表中的项目并对照另一个列表进行检查很简单

苹果有一些工具可以帮助你编写代码

在你的脚本中

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迭代到列表中项目的计数

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
i变量保存循环迭代次数。也就是说,在第一个环路上为1,在第300个环路上为300

因此,在第一个循环中将此\u项设置为JPEG搜索的项目i相当于写入将此\u项设置为JPEG搜索的项目1

但苹果省去了用i重复写每个项目的每个数字

变量i可以是您选择的符合正常允许变量命名语法的任何单词或字母

您可以做的事情是从匹配的项构建一个新列表。通过将它们复制到以前声明的列表中。然后,您可以在重复循环完成后处理该列表

这里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

非常感谢Mark,我可以从中得到一些建议。我更新了我的问题,以便更好地解释我的意图。这并不是我最终感兴趣的路径列表,而是我在这个阶段需要做的下一件事。抱歉,我仍然没有取得任何进展,我已经添加了更多的细节来全面解释这个用例。mdfind部分我不认为我需要,因为我将传递我想从另一个脚本中选择的文件列表。我正在努力解决的问题是:在填充了所有要筛选的.jpg文件的列表后,我无法正确地获取项目列表以对照我的列表进行检查。我已更新了答案。我想放一些图片进去,但我不能。我看到了其他有线图像。这项服务显然有问题。哇,有很多细节-非常感谢。当我这个周末回来的时候,我会告诉你事情的进展,再次感谢你!