1 votos

Cómo interactuar con los programas cuando los nombres se leen de una lista

Tengo un script que comprueba las cargas de las aplicaciones si están abiertas, y las cierra si es así, y las abre si no.

Hasta ahora tenía una simple:

tell application "System Events"
if exists (process "Caffeine") then
    tell application "Caffeine" to quit
else
    tell application "Caffeine" to activate
end if
...
end tell

Para recorrer los programas. Hoy he tenido que editar algunos programas y he pensado "esto podría ser mucho más sencillo con un array y un bucle for"

Así que probé esto:

set theList to {"Caffeine", ...}
tell application "System Events"
repeat with prog in theList
    if exists (process prog) then
        tell application prog to quit
    else
        tell application prog to activate
    end if
end repeat
end tell

Pero ahora por alguna razón me da un error, cada vez que ejecuto el script:

error "System Events obtuvo un error: La conexión no es válida". número -609

El error aparece siempre desde un punto diferente en el script.
Estoy muy confundido por qué esto no funciona.

¿Puede alguien ayudarme a conseguir que esto funcione?

2voto

Scott Saad Puntos 247

"La conexión no es válida" significa que el script no puede comunicarse con la aplicación. Tal vez se ha abandonado durante la ejecución ¿tal vez hay una duplicación en su lista? Mi mejor suposición es que hay más de un proceso generado por una aplicación.

De todos modos, creo que su metodología podría mejorarse. Uno de tus problemas es que estás comprobando el proceso para cada elemento de tu lista. Deberías compilar una lista de procesos y comprobarla. Esto evita el problema de los procesos duplicados para la misma aplicación. También resuelve el problema de que la lista de procesos cambie durante la ejecución del script.

set appList to {"Caffeine", ...}

tell application "System Events" 
    set procList to (name of every process)
end tell

repeat with appName in appList
    if (procList contains appName) is true then
        tell application appName to quit
    else
        tell application appName to activate
    end if
end repeat

Si sigue obteniendo errores, es posible que tenga que encerrar las declaraciones de la aplicación tell en try bloques .

Una cosa más: el enfoque que estás tomando no funciona bien si sólo algunas de las aplicaciones están abiertas y otras no. Estás comprobando cada una individualmente y saliendo si está abierta, lanzando si no lo está. Así que tu lista de aplicaciones seguirá dividida entre abiertas/cerradas. Parece que quieres abrir un "conjunto" de aplicaciones y cerrar un "conjunto" de aplicaciones usando el mismo script.

Por lo tanto, puede considerar dividir esto en dos scripts, "open set" y "quit set", y/o comprobar si su aplicación "principal" está abierta y abrir/cerrar en cascada su lista de aplicaciones dependiendo del estado de esa aplicación.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X