0

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

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

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

(代码示例后更详细)

-- later within the search results list I get, I want to select these
set filesToSelect to {"/Users/me/Desktop/photo.jpg", "/Users/me/Documents/image.jpeg"}

-- the actual app is JPEGmini but the same principle applies to Preview
tell application "Preview"

  -- start the app
  activate

  -- let it boot up
  delay 3

  -- ensure it still has focus
  activate

end tell

tell application "System Events"

  tell process "Preview"
    -- spawn "Open" window
    keystroke "o" using {command down}
    delay 1
    -- spawn "Go to" window
    keystroke "g" using {command down, shift down}
    delay 1
    -- Go to root of hard drive
    keystroke "/"
    keystroke return
    delay 1
    -- Perform search
    keystroke "f" using {command down}
    delay 1
    keystroke ".jpg OR .jpeg"
    keystroke return
  end tell

end tell

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

我尝试了一些变化,但无处可去。

谢谢你的时间。

4

1 回答 1

1

您可以通过在 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
于 2013-06-25T20:30:02.007 回答