同じアプリケーションの複数のインスタンスへの参照で、名前による 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
各インスタンスを個別にスクリプト化する方法について何か考えはありますか?