1

同じアプリケーションの複数のインスタンスへの参照で、名前による osascript のインデックスのボトルネックの回避策を考えられる人はいますか?

2 つのプロセス ID (同じアプリケーションの 2 つの異なるインスタンスのそれぞれに 1 つずつ) を取得すると、osascript はいずれかの pid と引き換えに同じインスタンスを返します。まるで最初に pid をアプリケーション名にマップし、次に最初のアプリケーション プロセスをその名前。

たとえば、VLC.app の 2 つの異なるインスタンスを開始し、次のような 2 つの異なるビデオ ファイルを再生します。

open -na /Applications/VLC.app ~/fileA.m4v
open -na /Applications/VLC.app ~/fileB.m4v

次に、次のように 2 つの個別のアプリケーション プロセス ID を取得します。

echo "$(ps -ceo pid=,comm= | awk '/VLC/ { print $1}')"

その後、Applescript または Yosemite JXA Javascript を使用して、いずれかの pid からアプリケーション オブジェクトへの参照を取得できます。

ただし、どのプロセス ID を指定しても、同じビデオ ファイルを実行している同じインスタンスへの参照が常に返されることがわかります。あたかも osascript が単に pid をアプリケーション名に変換し、常に最初のプロセスを返すかのように、その名前に一致します。

アプリケーション用 Yosemite Javascript:

function run() {
    var app = Application.currentApplication();
    app.includeStandardAdditions = true;

    var lstVLC = app.doShellScript(
            "echo \"$(ps -ceo pid=,comm= | awk '/VLC/ { print $1}')\""
        ).split(/[\r\n]/).map(Number).map(Application);

    return {
        firstInstance: lstVLC[0].windows[0].name(),
        secondInstance: lstVLC[1].windows[0].name()
    };
}

アップルスクリプト:

on run {}
    set strCMD to "echo \"$(ps -ceo pid=,comm= | awk '/VLC/ { print $1}')\""
    set lstNum to paragraphs of (do shell script strCMD)
    repeat with i from 1 to length of lstNum
        set item i of lstNum to (item i of lstNum) as number
    end repeat


    tell application "System Events"
        set oProcA to first application process where unix id = (item 1 of lstNum)
        set oProcB to first application process where unix id = (item 2 of lstNum)
    end tell

    return [name of first window of oProcA, name of first window of oProcB]
end run

各インスタンスを個別にスクリプト化する方法について何か考えはありますか?

4

4 に答える 4

1

インスタンスごとに、次のように、特定のプロセスと同じ行からウィンドウの名前を尋ねます。

set windowNames to {}
set lstNum to paragraphs of (do shell script "ps -ceo pid=,comm= | awk '/VLC/ { print $1}'")
tell application "System Events" to repeat with i in lstNum
    set end of windowNames to name of first window of (first application process where unix id = i)
end repeat
return windowNames
于 2015-04-01T13:40:39.770 に答える
0

javascript でjackjr300のアプローチを使用して、少なくとも UI スクリプトを取得します (ただし、アプリケーション オブジェクト インターフェイスには対応していません)。

function run() {
    var appSE = Application("System Events");
    app = Application.currentApplication();

    app.includeStandardAdditions = true;

    function uiWidgets(lngID) {
        return appSE.processes.whose({
            unixId: lngID
        })[0].windows[0].uiElements();
    }

    var lstWidgets = app.doShellScript(
            "ps -ceo pid=,comm= | awk '/VLC/ { print $1}'"
        ).split(/\r/).map(Number).map(uiWidgets);

    return lstWidgets;
}
于 2015-04-01T15:53:19.740 に答える
0

JXA はバグと欠陥のある設計のバンドルです。この権利のようなことを怠ったことは気のめいるようですが、まったく驚くべきことではありません (AS チームにはフォームがあります)。

AppleScript に関して言えば、PID によってアプリをターゲットにする直接的な方法は提供されていません。以前は、Remote Apple Events を有効にしてプロセスをeppc://USER@HOST/APPNAME?pid=PIDURL でターゲットにすることでごまかしたかもしれませんが、10.10 で試してみると、常に「リモート アクセスが許可されていません」というエラーが返されたので、機能するかどうかはわかりませんでした。

Appscriptはスリープ状態でこれを行うことができましたが、Appleのカーボン戦争と「レガシー」ステータスを余儀なくされた安っぽい「代替」Cocoa APIのために、私はそれに対する公的サポートをやめました

正式にサポートされている有効なオプションの 1 つは、OS X の Scripting Bridge フレームワークです。これは、PID によってプロセスをターゲットにする方法を提供します。JXA と同様に、設計上の欠陥、欠落している機能、およびアプリケーションの互換性の問題に満ちているため、YMWV.

于 2015-04-01T17:03:24.640 に答える