Может ли кто-нибудь подумать об обходном пути для обертки-указательного указателя по имени в виде ссылки на несколько экземпляров одного и того же приложения?Как можно адресовать два экземпляра одного и того же приложения через 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}')"
Мы можем использовать Javascript Applescript или Yosemite JXA для получения ссылки на объект приложения из любого 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()
};
}
Applescript:
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
Любые мысли на пути к скриптовый каждый экземпляр отдельно?
Мы можем, конечно, получить свойства, открытые такими системными событиями, но это все равно не позволяет нам получить сценарий для объекта приложения для каждого из экземпляров. Если, например, мы спрашиваем JXA Javascript для экземпляра приложения pid, он просто дает нам первый экземпляр с соответствующей строкой имени, независимо от конкретного pid ... – houthakker
Tho на вторых мыслях - ваш подход - хороший путь к обход объекта приложения и выполнение некоторых пользовательских скриптов ... – houthakker