Applescript: Get absolute path of item in a File > Open window

。_饼干妹妹 提交于 2019-12-23 05:09:05

问题


I'm trying to automate JPEGmini which is not entirely scriptable - the only way to control it is via the "Open" dialog.

Repeatedly calling it once per image is extremely slow.

Instead I'm trying to to perform a search for .jpg or .jpeg files in the "Open" dialog, so that within that result set I can select the batch of files I want to process and open them in a single pass.

(More detail after the code example)

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

Having done the above, how do I access the list of search results, repeat over each item and get it's absolute file path?

I've tried a few variations but am getting nowhere.

Thanks for your time.


回答1:


You could simplify this by using cross between the shell command line and applescript.

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

The mdfind command

consults the central metadata store and returns a list of files that match the given metadata query. The query can be a string or a query expression.

AFAIK this is what spotlight uses.

mdfind documents will give you an idea of how this command works. But ths script searches only in "/" and looks for content type attribute that is public.jpeg

The return is text. A list of POSIX Paths of the matching files. This text is like a text document each path on a new line but in effect one item as far as Applescript is concerned.

They need to be broken up in a applescript list. So I do this by asking for the paragraphs of the result.

Also if you want to open a new finder window:

try something like:

tell application "Finder"
    activate

    set myWindow to make new Finder window to startup disk
end tell

To answer why you are getting your error in trying to get the POSIX paths of the target of the files.

If you look at the properties of one of the files returned in your Search Window.

tell application "Finder" to set fileList to properties of first file of  front window

You will see the file properties have a property named original item

If you really want to do it the way you are doing it then one way is to get the original item. Coerce the result into alias form then get the posix path.

tell application "Finder" to set aFile to POSIX path of (original item of first file of front window as alias)

In a normal finder window you can use.

tell application "Finder" to set fileList to POSIX path of (first file  of front window as alias)

These are just examples to show you whats going on.

The difference in the type of finder window results is because in a Search window what is being displayed is alias files (class:alias file) to the original files, hence the original item property.

Update 2.

To go through your items in your list and check them against another list is simple.

Apple have some tools that will help you with the code.

When in your script.

crtl + Mouse Click the Variable that will hold the jpg result as a list.

This will give you a contextual menu that contains helper code. Go to the Repeat routines folder in the menu.

Then to its 'Process Every Item'

This will add a repeat routine to your code.

And from there you can use it to check each item against your other list.

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

The repeat routine works like this.

It loops over each item in the given list

It will iterate from item 1 to the count of the items in the list.

The i variable holds the loop iteration number. I.e it will be 1 on the first loop and 300 on the 300th loop.

so on the first loop set this_item to item i of jpegSearch is equivalent to writing set this_item to item 1 of jpegSearch

But apple saves you having to write each number of each item with the Repeat with i..

The variable i can be any word or letter you choose that conforms to the normal allowed Variable naming syntax.

Something you can do is build a new list from the matched items. by copying them into a previously declared list. You can then work on that list after the repeat loop has completed.

Here bigList is declared as a empty list {}

The matched items are copied to the bigList. Each new item it receives is added to the end of the list.

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


来源:https://stackoverflow.com/questions/17305981/applescript-get-absolute-path-of-item-in-a-file-open-window

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!