2009-01-30 5 views

Répondre

10

Il est bien ... Je pense avoir trouvé ma réponse:

tell application "System Events" to set the visible of every process to true 

set white_list to {"Finder"} 

try 
    tell application "Finder" 
     set process_list to the name of every process whose visible is true 
    end tell 
    repeat with i from 1 to (number of items in process_list) 
     set this_process to item i of the process_list 
     if this_process is not in white_list then 
      tell application this_process 
       quit 
      end tell 
     end if 
    end repeat 
on error 
    tell the current application to display dialog "An error has occurred!" & return & "This script will now quit" buttons {"Quit"} default button 1 with icon 0 
end try 
+0

Très bonnes choses. Une chose à noter est que le système d'exploitation (au moins sur 10.7.4) active automatiquement Finder - avec des fenêtres non minimisées montrant - une fois la dernière application se ferme. Si vous préférez une vue propre de votre bureau, vous pouvez réduire toutes les fenêtres du Finder, dites à l'application "Evénements système" de cliquer sur le premier bouton de chaque fenêtre du processus "Finder" dont la description est "minimiser"), et/ou fermez-les tous, "tell application" Finder "pour fermer chaque fenêtre". Si vous les fermez, les minimiser d'abord empêche le scintillement. – mklement0

+0

Lors de l'utilisation de la propriété 'name' de la classe de processus _usually_ works, il existe des applications pour lesquelles cette valeur diffère du nom de l'application affiché dans l'interface utilisateur et tel qu'il est compris par l'instruction' tell application'. Par conséquent, il est préférable d'utiliser la propriété 'display name' (bien qu'il puisse encore y avoir des cas où même cela ne fonctionne pas). Ainsi, la ligne pertinente ci-dessus devrait être 'set process_list 'pour le nom affiché de chaque processus dont le visible est vrai'. – mklement0

0
tell application "System Events" to set quitapps to name of every application process whose visible is true and name is not "Finder" 

repeat with closeall in quitapps 

quit application closeall 

end repeat 
+1

Bienvenue sur Stackoverflow. Pourriez-vous prolonger un peu votre réponse pour expliquer comment cela résout le problème? – Daenarys

+0

Ceci ferme toutes les applications visibles, à l'exception du finder, de manière à ce qu'il ne ferme pas d'autres processus en cours pouvant affecter les processus d'arrière-plan de l'ordinateur. – Jeff

1
tell application "System Events" to set the visible of every process to true 

set white_list to {"Finder"} 

try 
    tell application "Finder" 
     set process_list to the name of every process whose visible is true 
    end tell 
    repeat with i from 1 to (number of items in process_list) 
     set this_process to item i of the process_list 
     if this_process is not in white_list then 
      tell application this_process 
       quit 
      end tell 
     end if 
    end repeat 
on error 
    tell the current application to display dialog "An error has occurred!" & return & "This script will now quit" buttons {"Quit"} default button 1 with icon 0 
end try 
0

Après quelques googler, j'ai trouvé une meilleure approche:

  • Il utilise background only pour construire la liste des applications initiale, plutôt que visible is true. La différence est que les autres scripts échouent pour quitter une application cachée avec ⌘H.
  • Il fournit une liste d'exclusions afin que, par exemple, vous puissiez empêcher votre éditeur de script de de quitter chaque fois que vous testez le script.

Adapté de a thread on MacScripter.

-- get list of open apps 
tell application "System Events" 
    set allApps to displayed name of (every process whose background only is false) as list 
end tell 

-- leave some apps open 
set exclusions to {"AppleScript Editor", "Automator", "Finder", "LaunchBar"} 

-- quit each app 
repeat with thisApp in allApps 
    set thisApp to thisApp as text 
    if thisApp is not in exclusions then 
    tell application thisApp to quit 
    end if 
end repeat