wants que control macos safari applescript osascript

macos - que - Cómo verificar en AppleScript si una aplicación se está ejecutando, sin iniciarla, mediante la utilidad osascript



osascript que es (6)

Considere el siguiente 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

El problema: cuando ejecuto esto a través de la utilidad de línea de comandos osascript , si Safari no se está ejecutando, se inicia y el script informa "En ejecución". Este no es el comportamiento que deseo o espero. Tenga en cuenta que funciona como deseado / esperado cuando se ejecuta dentro del Editor de AppleScript.

¿Es esto un error de osascript / problema conocido? ¿O es de alguna manera el comportamiento previsto por razones que me estoy perdiendo? ¿Alguien puede hacer que funcione como se desee? (Por cierto, estoy ejecutando OSX 10.7.5; no veo cómo obtener osascript para informar un número de versión).

Si comenta las líneas tell / end tell , se comporta como esperaba: si Safari no se está ejecutando, no lo ejecuta e imprime "No se está ejecutando". Entonces me parece que el tell es lo que está causando el lanzamiento de Safari, pero no necesita ser ejecutado, solo presente en el script ...? Por un tiempo me pregunté si tal vez así era como se supone que debería funcionar, pero dado que no funciona así en AppleScript Editor, supongo que no ...

De hecho, aquí hay otra versión más loca con un comportamiento similar:

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

¡Esto todavía siempre lanza Safari, aunque tell está dentro de un bloque if false después de la declaración de devolución! (Pero, de nuevo, esto está bien en el Editor de AppleScript).

Por cierto, este comportamiento no está limitado a Safari, pero tampoco es universal:

  • Las aplicaciones afectadas incluyen: Safari, TextEdit, iPhoto, AppleScript Editor, iTerm, ...
  • Las aplicaciones no afectadas incluyen: Google Chrome, iTunes, vista previa, correo, terminal, libreta de direcciones, Echofon, ...

Entonces, ¿alguien tiene alguna idea sobre cómo puedo solucionarlo o sobre esto? ¿Es un error osascript ? ¿O me falta algo sobre la semántica de AppleScript?

Por contexto: estoy tratando de escribir un script (para ser incrustado / llamado desde alguna python) que consulta abrir navegadores para las URL de las pestañas que tienen abiertas; Lo tengo todo funcionando bien, excepto que siempre se inicia Safari, ya sea que esté abierto o no. He reducido ese comportamiento indeseable al caso de prueba simple que se muestra arriba. No conozco ninguna forma de ejecutar este script desde Python sin usar osascript , que no sea appscript , que no quiero usar porque ya no está desarrollado / apoyado / recomendado .

¡Muchas gracias por todas las aportaciones / ideas!


Alguna información:

"Modelo de objeto de aplicación mejorado":

tell application "iTunes" if it is running then pause end if end tell

También puedes hacerlo de esa manera:

if application "iTunes" is running then tell application "iTunes" to quit end if

También puedes hacer esto:

get name of application "iTunes" get version of application "iTunes"

Y para completar el viaje:

get id of application "TextEdit" --> "com.apple.TextEdit" tell application id "com.apple.TextEdit" make new document end tell

Ese fue el "Modelo de Objeto de Aplicación Mejorado". Si todavía se inicia una aplicación (por ejemplo, la primera vez que compila y ejecuta el script), supongo que es porque AS tiene que obtener cierta información de la aplicación que no encontró en el diccionario (¿o algo así ...? )


De acuerdo, sé que esta pregunta es muy antigua, pero me encontré con que estaba buscando un problema diferente y tuve que considerar lo complicadas que son algunas de estas respuestas.

El código simple para lograr lo que quiere (ed) es:

tell application "System Events" if application process "Safari" exists then -- do stuff you want to do only if Safari exists end if end tell

En sistemas más antiguos, la sintaxis solía ser:

tell application "System Events" if exists of application process "Safari" is true then -- do stuff you want to do only if Safari exists end if end tell

Uno de estos definitivamente debería funcionar para usted, buscador intrépido de soluciones Applescript para la acción solo cuando se está ejecutando una aplicación.

Oh! Consejo de bonificación: Y si no está seguro de cuál es exactamente el nombre del proceso de la aplicación ( generalmente, pero no siempre es el nombre de la aplicación), antes de codificar la ejecución final del guión ...

tell application "System Events" get every application process end tell

Y encuentre el nombre del proceso de su aplicación en los resultados.

Aquí hay una captura de pantalla de ejecutar ese comando. (Tenga en cuenta los trillones de instancias de Google Chrome Helper . ¡Gracias a Google!)

HTH!


Sin embargo, todas las respuestas anteriores tienen el mismo problema:

Buscan la aplicación por su nombre. Sin embargo, el usuario puede cambiar el nombre de la aplicación, y luego la secuencia de comandos creerá que la aplicación no se ejecuta, cuando de hecho lo hace.

Para comprobar correctamente si hay una aplicación en ejecución, debe encontrarla mediante su ID de paquete, que el usuario no puede cambiar.

La ID del paquete se puede consultar con este comando, por ejemplo:

tell application "System Events" get bundle identifier of application process "Safari" end tell

Para verificar si se está ejecutando una aplicación con un ID de paquete particular, use este código:

tell application "System Events" set ids to bundle identifier of every application process if ids contains "com.apple.safari" then return "Running" else return "Not running" end if end tell

Además, aquí hay un ejemplo para verificar si una aplicación se está ejecutando, luego salir de ella, luego reiniciarla, asegurando que se relanzó la misma aplicación que se estaba ejecutando antes, y no alguna otra copia que también puede existir:

set bundleID to "com.apple.safari" set apps to runningApps(bundleID) set appCount to length of apps if appCount is not 0 then quit application id bundleID repeat while length of runningApps(bundleID) = appCount -- wait for the app to quit end repeat open first item of apps end if on runningApps(bundleID) -- The try block is to catch the rare case of having more than one -- copy of an app running at the same time. Unfortunately, in that -- case this code will not run as expected, because we don''t get the -- correct list of multiple items back then. But at least the script -- will not crash from it but handle it gracefully. tell application "System Events" try return application file of (every application process whose bundle identifier = bundleID) end try end tell return {} end runningApps


Sospecho que la razón por la que recibes esto es porque cada vez que llamas al script desde la línea de comandos con osascript, el script se está compilando.

El hecho de compilar en una aplicación tell hará que la aplicación se inicie.

Llamar al script desde la línea de comandos con osascript desde un archivo precompilado, es decir. scpt no causa este comportamiento porque no se está compilando por hacer.

Pero llamarlo desde un archivo de texto sin formato (.txt, .sh) lo hará para que la aplicación se inicie.

Si no desea utilizar un archivo .scpt y desea utilizar un archivo de texto sin formato, puede probar el truco de poner un comando ejecutar script en el 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 run script "tell application /"Safari/" open location /"http://google.com/" end tell" return "Running" else return "Not running" end if

El script en el script de ejecución solo se compila cuando es necesario. Necesitarás escapar de cualquier carácter como citas como en mi ejemplo.

Será más fácil si primero escribe el guión en un documento normal de AppleScript y lo compila para verificar si hay errores.

Luego cópielo en el archivo de texto sin formato.

ACTUALIZACIÓN **

El método que utilicé anteriormente era de un viejo script que había usado para resolver este problema un tiempo antes de responder aquí.

La respuesta funciona y no está tratando de ser elegante. ;-)

De hecho, me gusta el método user1804762 a continuación. Como funciona, pero siento que la respuesta no es lo suficientemente clara, daré un ejemplo sobre su uso.

set appName to "Safari" if application appName is running then tell application id (id of application appName) open location "http://google.com" end tell return "Running" else return "Not running" end if

Este script se puede ejecutar desde la línea de comando con osascript

ejemplo:

osascript /Users/USERNAME/Desktop/foo.scpt

Tenga en cuenta que el script se guarda como un script compilado. Esto funcionará bien y también puede guardarlo y usarlo como un script de texto sin formato.

es decir

osascript /Users/USERNAME/Desktop/foo.applescript


Tuve el mismo problema que el descrito aquí al intentar configurar un AppleScript (activado por un gesto de BetterTouchTool) que reproduce / pausa VLC o iTunes, pero solo iTunes si VLC no se está ejecutando (debido a mi flujo de trabajo) y, naturalmente, solo VLC mientras está corriendo. (Utilizo el disparador automático de pausa / reproducción para iTunes en la configuración de VLC, para iniciar y salir de la aplicación).

VLC siempre se lanzó con el primer uso del disparador BetterTouchTool después de cada relanzamiento de BTT, ya que el diccionario caché se elimina en ese punto y el manejador de AppleScript tiene que ejecutar cada aplicación guionizada si un tell está dirigido a él para llamar a su diccionario.

No encontré nada que evitara esto en ninguna parte; Hubo algunos intentos, pero ninguno funcionó para mí, ya que la guía de secuencia de comandos del controlador de secuencia de comandos no es algo en lo que podamos influir. Se me ocurrió esta sucia solución:

  • Cree un archivo AppleScript separado que solo contenga la línea que incluye el tell for VLC
  • Guárdalo en algún lugar donde no te moleste
  • Reemplace la línea que contiene tell en el AppleScript original con una línea que ejecute ese script

Esto conducirá a la primera compilación del script que no llama a la aplicación (VLC, en mi caso) directamente, solo al script, lo que significa que la aplicación no necesitará iniciarse.

VLC deberá iniciarse una vez que se llame a un archivo por separado, pero, bueno, si llama a ese archivo para decirle algo a VLC, ya tendrá VLC abierto (o lo querrá abrir) de todos modos.

El AppleScript que llamo a través de mi BetterTouchTool-trigger (un toque específico en el panel táctil, en mi caso) se ve así:

if application "iTunes" is running and not application "VLC" is running then tell application "iTunes" to playpause

final si la aplicación "VLC" se está ejecutando, ejecute el script "/Users/jannis/bin/PlayVLC.scpt" finalice si

El archivo AppleScript por separado ("PLayVLC.scpt, guardado en una carpeta llamada" bin "en mi carpeta de usuario que creé manualmente hace años atrás para tales fines) es solo esto:

tell application "VLC" to play

Si abre esa secuencia de comandos manualmente, por supuesto también lanzará VLC. Pero con suerte no será necesario a menudo, o nunca.

De hecho, no tengo idea si esto crea problemas más profundos que no conozco ya que no soy un codificador profesional; si es así, por favor notifícame. Espero que esto ayude a cualquiera!


tell application "Finder" set applicationsnames to get the name of every process whose visible is true end tell set appName to "Safari" if applicationsnames does not contain appName then say (appName & " is not running") --add here what you want to happen end if return applicationsnames

Esto está volviendo {"Finder", "JavaAppLauncher", "firefox", "Microsoft Word", "iTunes", "AppleScript Editor"} para mí

Espero que esto ayude