0

完全にスクリプト化できない JPEGmini を自動化しようとしています - それを制御する唯一の方法は、[開く] ダイアログを使用することです。

画像ごとに1回繰り返し呼び出すと、非常に遅くなります。

代わりに、[開く] ダイアログで .jpg または .jpeg ファイルの検索を実行しようとしています。その結果セット内で、処理したいファイルのバッチを選択し、それらを 1 回のパスで開くことができます。

(コード例の後に詳細)

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

シェルコマンドラインとapplescriptの間でクロスを使用することで、これを簡素化できます.

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

mdfindコマンド_

中央のメタデータ ストアを参照し、指定されたメタデータ クエリに一致するファイルのリストを返します。クエリは、文字列またはクエリ式にすることができます。

私の知る限り、これはスポットライトが使用するものです。

mdfindドキュメントを参照すると、このコマンドがどのように機能するかがわかります。ただし、このスクリプトは " / " のみを検索し、public.jpeg であるコンテンツ タイプ属性を探します。

リターンはテキストです。一致するファイルの POSIX パスのリスト。このテキストは、新しい行の各パスのテキスト ドキュメントのようなものですが、Applescript に関する限り、実際には 1 つのアイテムです。

それらは、applescript リストに分割する必要があります。そのため、結果の段落を要求することでこれを行います。

また、新しいファインダー ウィンドウを開きたい場合:

次のようなものを試してください:

tell application "Finder"
    activate

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

ファイルのターゲットのPOSIXパスを取得しようとしてエラーが発生する理由に答えるには。

検索ウィンドウに返されたファイルの 1 つのプロパティを見ると、

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

ファイルのプロパティに元のアイテムという名前のプロパティがあることがわかります

あなたが本当にあなたがやっている方法でそれをやりたいのなら、1つの方法はオリジナルのアイテムを手に入れることです. 結果をエイリアス形式に変換してから、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)

これらは、何が起こっているかを示すための単なる例です。

ファインダ ウィンドウの結果のタイプの違いは、検索ウィンドウに表示されるのは元のファイルのエイリアス ファイル (class: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 に設定することと同じです

しかし、Apple では、 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 に答える