Quelqu'un peut-il penser à une solution de contournement pour l'index-par-nom bouteille-cou dans sa référence à plusieurs instances de la même application?Comment peut-on adresser deux instances de la même application par l'intermédiaire d'osascript
Si nous obtenons deux identifiants de processus - un pour chacune des instances différentes de la même application, osascript renvoie la même instance en échange de l'un ou l'autre - comme s'il mappait d'abord le pid à un nom d'application, puis récupérait le premier processus de demande avec ce nom.
Par exemple, commencer deux instances différentes de VLC.app, en jouant deux fichiers vidéo différents, avec quelque chose comme:
open -na /Applications/VLC.app ~/fileA.m4v
open -na /Applications/VLC.app ~/fileB.m4v
puis obtenir les deux processus d'application distincts ids avec, par exemple:
echo "$(ps -ceo pid=,comm= | awk '/VLC/ { print $1}')"
Nous pouvons ensuite utiliser Applescript ou Yosemite JXA Javascript pour obtenir une référence à un objet d'application à partir de pid. Il s'avère cependant que quel que soit l'identifiant de processus que nous fournissons, nous recevons toujours une référence à la même instance, exécutant le même fichier vidéo, comme si osascript traduisait simplement un pid en un nom d'application, puis renvoyait toujours le premier processus qui correspond à ce nom.
Yosemite Javascript pour les applications:
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
Toute réflexion sur une route de script séparément chaque instance?
Nous pouvons certainement obtenir les propriétés exposées par des événements système comme cela, mais cela ne nous permet toujours pas d'obtenir un objet d'application scriptable pour chacune des instances. Si, par exemple, nous demandons JXA Javascript pour une instance d'application par pid, cela nous donne juste la première instance avec une chaîne de nom correspondante, quel que soit le pid ... – houthakker
A la réflexion, votre approche est un bon moyen de contournant l'objet Application et faisant des scripts d'interface utilisateur ... – houthakker