Come interagire con i programmi quando i nomi vengono letti da un elenco

1

Ho uno script che controlla la presenza di molte applicazioni se sono aperte e le chiude se sì, e le apre se non lo sono.

Fino ad ora ho avuto un semplice:

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

Per passare attraverso i programmi. Oggi ho dovuto modificare alcuni programmi e ho pensato "questo potrebbe essere molto più semplice con un array e un ciclo"

Quindi ho provato questo:

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

Ma ora per qualche motivo ottengo un errore, ogni volta che eseguo lo script:

error "System Events got an error: Connection is invalid." number -609

L'errore si apre sempre da un punto diverso nello script.
Sono davvero confuso perché questo non funziona.

Qualcuno può aiutarmi a farlo funzionare?

    
posta deiga 20.02.2011 - 18:52
fonte

1 risposta

2

"Connessione non valida" significa che lo script non può comunicare con l'applicazione. Forse è stato chiuso durante l'esecuzione ... forse c'è una duplicazione nella tua lista? La mia ipotesi migliore è che ci sia più di un processo generato da un'applicazione.

Ad ogni modo, penso che la tua metodologia potrebbe essere migliorata. Uno dei tuoi problemi è che stai controllando il processo per ogni elemento nel tuo elenco. Dovresti compilare un elenco di processi e controllarlo. Ciò evita il problema dei processi duplicati per la stessa applicazione. Si occupa anche del problema dell'elenco dei processi che cambia durante l'esecuzione dello 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

Se continui ad avere errori, potresti dover allegare le dichiarazioni dell'applicazione tell in try blocchi .

Un'altra cosa: l'approccio che stai prendendo non funziona bene se solo alcune delle applicazioni sono aperte e altre no. Stai controllando ciascuno di essi individualmente e smetti se è aperto, avviando se non lo è. Quindi il tuo elenco di applicazioni sarà ancora diviso tra open / shut down. Sembra che tu voglia aprire un "set" di applicazioni e chiudere un "set" di applicazioni usando lo stesso script.

Pertanto, potresti prendere in considerazione la possibilità di dividerlo in due script, "open set" e "quit set", e / o controllare se l'applicazione "principale" è aperta e in cascata l'apertura / chiusura del tuo elenco di applicazioni a seconda di quello stato di una applicazione.

    
risposta data 22.02.2011 - 04:44
fonte

Leggi altre domande sui tag