Может ли кто-нибудь придумать обходной путь для узкого места в osascript-индексировании по имени в его ссылке на несколько экземпляров одного и того же приложения?
Если мы получаем два идентификатора процесса - по одному для каждого из двух разных экземпляров одного и того же приложения, osascript возвращает один и тот же экземпляр в обмен на любой pid - как если бы он сначала сопоставлял pid с именем приложения, а затем извлекает первый процесс приложения с это имя.
Например, запустите два разных экземпляра VLC.app, воспроизводя два разных видеофайла, примерно так:
open -na /Applications/VLC.app ~/fileA.m4v
open -na /Applications/VLC.app ~/fileB.m4v
затем получите два отдельных идентификатора процесса приложения, например:
echo "$(ps -ceo pid=,comm= | awk '/VLC/ { print $1}')"
Затем мы можем использовать Applescript или Yosemite JXA Javascript, чтобы получить ссылку на объект приложения из любого pid.
Однако оказывается, что какой бы идентификатор процесса мы ни указали, нам всегда возвращается ссылка на один и тот же экземпляр, выполняющий один и тот же видеофайл, как если бы 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
Есть какие-нибудь мысли по поводу сценария для каждого экземпляра отдельно?