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

1

Tengo un script que comprueba si hay muchas aplicaciones abiertas, las cierra, si es así, y las abre si no.

Hasta ahora tenía un 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

Pasar por los programas. Hoy tuve que editar algunos programas y pensé que "esto podría ser mucho más simple con una matriz y un bucle for"

Así que intenté 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, recibo un error, cada vez que ejecuto el script:

  

error "Los eventos del sistema obtuvieron un error: la conexión no es válida." número -609

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

¿Puede alguien ayudarme a hacer que esto funcione?

    
pregunta deiga 20.02.2011 - 18:52

1 respuesta

2

"La conexión no es válida" significa que la secuencia de comandos no se puede comunicar con la aplicación. Quizás se haya abandonado durante la ejecución ... ¿tal vez haya una duplicación en su lista? Mi mejor conjetura es que hay más de un proceso generado por una aplicación.

De todos modos, creo que tu metodología podría mejorarse. Uno de sus problemas es que está verificando el proceso para cada elemento en su lista. Debe compilar una lista de procesos y verificar eso. Esto evita el problema de los procesos duplicados para la misma aplicación. También trata el problema del cambio de la lista de procesos 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 aún recibe errores, es posible que deba incluir las declaraciones de la aplicación tell en try blocks .

Una cosa más: el enfoque que está tomando no funciona bien si solo algunas de las aplicaciones están abiertas y otras no. Usted está comprobando cada uno individualmente y abandonando si está abierto, iniciando si no lo está. Por lo tanto, su lista de aplicaciones aún se dividirá entre abrir / cerrar. Parece que desea abrir un "conjunto" de aplicaciones y cerrar un "conjunto" de aplicaciones utilizando el mismo script.

Por lo tanto, es posible que desee considerar dividir esto en dos scripts, "conjunto abierto" y "conjunto de salida", y / o verificar si su aplicación "principal" está abierta y en cascada abrir / cerrar su lista de aplicaciones dependiendo de el estado de esa aplicación.

    
respondido por el ghoppe 22.02.2011 - 04:44

Lea otras preguntas en las etiquetas