Comment vérifier en AppleScript si une application est en cours d'exécution, sans avoir à lancer - par l'intermédiaire du osascript utilitaire
De considérer les éléments suivants AppleScript:
on is_running(appName)
tell application "System Events" to (name of processes) contains appName
end is_running
set safRunning to is_running("Safari")
if safRunning then
tell application "Safari"
-- Stuff I only want executed if Safari is running goes here.
end tell
return "Running"
else
return "Not running"
end if
Le problème: lorsque je l'exécute via le osascript
utilitaire de ligne de commande, si Safari n'est pas en cours d'exécution, il est lancé et l'écriture des rapports d'Exécution". Ce n'est pas le comportement que j'ai un désir ou d'attendre. Notez que cela fonctionne comme souhaité/prévu lorsque vous exécutez l'intérieur de l'Éditeur AppleScript.
Est-ce un osascript
bug /problème connu? Ou est-il en quelque sorte l'intention de comportement pour des raisons que je suis absent? Quelqu'un peut-il faire qu'il fonctionne comme souhaité? (BTW, je suis sous OSX 10.7.5; je ne vois pas comment obtenir osascript
pour signaler un numéro de version).
Si vous commentez la tell
/end tell
lignes, il se comporte comme je l'avais prévu: si Safari n'est pas en cours d'exécution, il ne se lance pas, et imprime "ne fonctionne Pas". Donc, il semble pour moi comme le tell
est ce qui est à l'origine de Safari à être lancé, mais il n'a pas besoin d'être exécuté, il suffit de présenter dans le script...? Pendant un moment je me suis demandé si c'était peut être juste la façon dont tell
est censé fonctionner, mais depuis qu'il n'est pas travail comme celui-ci dans l'Éditeur AppleScript, je ne crois pas...
En fait, en voici un autre, la garance, la version ayant le même comportement:
on is_running(appName)
tell application "System Events" to (name of processes) contains appName
end is_running
set safRunning to is_running("Safari")
return safRunning
if false then
tell application "Safari"
end tell
end if
Ce toujours lance Safari, même si tell
est à l'intérieur d'un if false
bloc après l'instruction de retour! (Mais encore une fois, c'est bien dans l'Éditeur AppleScript.)
BTW, ce comportement n'est pas limitée à Safari, mais il n'est pas universel:
- Les applications concernées incluent: Safari, TextEdit, iPhoto, l'Éditeur AppleScript, iTerm, ...
- Non les applications concernées incluent: Google Chrome, iTunes, Aperçu, de Messagerie, d'un Terminal, Carnet d'Adresses, Echofon, ...
Donc, quelqu'un a une idée sur comment je pourrais les corriger ou de les contourner cela? Est-il un osascript
bug? Ou ai-je raté quelque chose à propos d'AppleScript de la sémantique?
Pour le contexte: je suis en train d'écrire un script (pour être intégré appelé à partir de python) qui interroge les navigateurs ouverts pour les Url de tous les onglets qu'ils ont ouvert; j'ai tout fonctionne bien sauf qu'il a toujours lance Safari, si c'est ouvert ou pas. J'ai cuit que le comportement indésirable pour le test simple cas illustré ci-dessus. Je ne suis pas au courant de tout moyen d'exécuter ce script à partir de python sans l'aide de osascript
, autres que appscript, que je ne veux pas utiliser, parce que il n'est plus développé/pris en charge/recommandé.
Merci beaucoup pour toutes les entrées /points de vue!
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que la raison pour laquelle vous faites c'est parce que chaque fois que vous appelez le script à partir de la ligne de commande avec osascript le script est en cours d'élaboration.
La loi de la compilation sur un tell application sera autant que je sache faire du lancement de l'application.
De l'appel du script à partir de la ligne de commande avec osascript à partir d'un pré-compilé fichier je.e .scpt ne provoque pas ce comportement, car il n'y a pas de compilation à faire.
Mais de l'appeler à partir d'un texte brut (.txt,.sh ) fichier de sorte que l'application va lancer.
Si vous ne souhaitez pas utiliser un .scpt fichier et que vous voulez utiliser un fichier de texte brut, alors vous pourriez essayer l'astuce de mettre une exécuter le script de commande dans l'applescript.
Le script dans le exécuter le script est compilé uniquement en cas de besoin. Vous devrez échapper tous les caractères comme des citations comme dans mon exemple.
Il sera plus facile si vous écrivez le script dans un applescript document et l'a compilé pour vérifier les erreurs.
Puis de le copier dans le fichier de texte brut.
Mise à JOUR **
La méthode que j'ai utilisé ci-dessus a été à partir d'un vieux script que j'avais utilisé pour résoudre ce problème à un moment avant que j'ai répondu ici.
La réponse qui fonctionne et ne cherche pas à être élégant. 😉
En fait, j'aime user1804762 méthode ci-dessous. Comme il ne fonctionne pas mais se sentent la Réponse n'est pas assez clair alors je vais donner un exemple sur l'utilisation de ce.
Ce script peut être exécuté depuis la ligne de commande avec osascript
exemple:
osascript /Users/USERNAME/Desktop/foo.scpt
Avis que le script est enregistré comme un script compilé. Ce sera un travail sur ok et vous pouvez également enregistrer et l'utiliser comme un script en texte brut.
c'est à dire
osascript /Users/USERNAME/Desktop/foo.applescript
if application "app name" is running
ne fonctionne pas si l'utilisateur renommé de l'application! Idéalement, le script devrait ressembler pas de l'application par son nom mais par son id. Ce qui ne semble pas fonctionner avec la méthode proposée, mais uniquement en utilisant des "Événements du Système", je le crains.Quelques Infos:
"Améliorer L'Application Du Modèle Objet":
Vous pouvez également le faire de cette façon:
Vous pouvez également le faire:
Et pour terminer le voyage:
Qui a été le "Renforcement de l'Application Modèle d'Objet". Si une application encore lance (par exemple, la première fois que vous compiler & exécuter le script) je suppose que c'est parce QUE de a à obtenir des informations à partir de l'app qu'il n'a pas trouvé dans le dictionnaire (ou quelque chose comme ça...?).
if application "name" is running
ne fonctionne pas si l'utilisateur renommé de l'application!OK, je sais que cette question est vraiment vieux, mais je suis tombé sur elle à chercher une autre question et avait pour tuyau en considérant la complexité de certaines de ces réponses sont.
Le code simple pour réaliser ce que vous voulez(ed) est:
Sur des systèmes plus anciens, la syntaxe utilisé être:
L'un de ces devrait certainement travailler pour vous, intrépide à la recherche de la Applescript solutions pour l'action uniquement lorsqu'une application est en cours d'exécution.
Oh! Conseil Bonus: Et si vous n'êtes pas sûr de ce que le processus de demande de nom est exactement (c'est généralement mais pas toujours le nom de l'application), avant le codage final de votre script à exécuter...
Et de trouver votre app nom du processus dans les résultats.
Voici une capture d'écran de l'exécution de cette commande. (Note de l'zillions de Google Chrome Helper instances. Merci Google!)
HTH!
C'est le retour
{"Finder", "JavaAppLauncher", "firefox", "Microsoft Word", "iTunes", "AppleScript Editor"}
pour moiEspère que cette aide
Toutes faites précédemment réponses souffrent du même problème, cependant:
Ils recherchent l'application par son nom. Toutefois, l'utilisateur peut renommer l'application, puis le script va croire que l'app ne fonctionne pas, alors qu'en fait il ne.
De vérifier correctement pour une application en cours d'exécution, il doit être trouvé par ses bundle ID de l'utilisateur ne peut pas changer.
L'ID peut être demandé à cette commande, par exemple:
Pour vérifier si une application avec un ID de lot est en cours d'exécution, utilisez ce code:
En outre, voici un exemple pour vérifier si une application est en cours d'exécution, quittez, puis le relancer, en s'assurant que la même application est relancée en cours d'exécution avant, et non pas une autre copie qui peut également exister:
J'ai eu le même problème que décrit ici, essayer de mettre en place un script déclenché par un BetterTouchTool geste) qui joue/pause VLC ou iTunes, mais seulement iTunes si VLC n'est pas en cours d'exécution (à cause de mon travail) et, naturellement, seulement VLC alors qu'il est en cours d'exécution. (J'ai utiliser une fonction automatique de pause/play déclencheur pour iTunes de VLC les paramètres de lancement et de quitter l'application.)
VLC a toujours été lancée lors de la première utilisation de la BetterTouchTool-déclencher après chaque relance de BTT, dictionnaire-cache est supprimé et l'AppleScript gestionnaire a pour le lancement de chaque script demande si le fait de le dire est destiné à elle, afin de l'appeler de son dictionnaire.
Je n'ai pas trouver quelque chose qui évitait ce n'importe où; il y a eu quelques tentatives, mais aucun n'a fonctionné pour moi comme le dictionnaire-l'appel lancé par le gestionnaire de scripts n'en est rien, nous pouvons influencer. Je suis venu avec cette sale solution de contournement:
Cela conduira à la première compilation du script n'est pas l'appel de l'application (VLC, dans mon cas) directement, seul le script, ce qui signifie que la demande n'aura pas besoin de lancer.
VLC faut lancer une fois que fichier distinct est appelé, mais, bon, si vous appelez ce fichier afin de pouvoir dire VLC quelque chose, vous aurez VLC déjà ouvert (ou voudront ouvrir) de toute façon.
L'AppleScript je l'appelle par mon BetterTouchTool-trigger (un spécifique, appuyez sur le pavé tactile, dans mon cas) ressemble à ceci:
fin si
si l'application "VLC" est en cours d'exécution, puis
exécuter le script "/Users/jannis/bin/PlayVLC.scpt"
fin si
Les séparer fichier AppleScript ("PLayVLC.scpt, enregistrés dans un dossier appelé "bin" dans mon dossier utilisateur que j'ai créé manuellement il y a des siècles à de telles fins) est juste ceci:
Si vous ouvrez le script manuellement, il sera bien sûr également lancer VLC. Mais qui je l'espère ne sera pas souvent nécessaire, ou jamais.
En fait, j'ai aucune idée si cela crée des problèmes plus profonds, je ne sais pas comme je ne suis pas un pro codeur; dans l'affirmative, veuillez m'en informer. J'espère que cela aide quelqu'un!