• Bonjour Visiteur. Bienvenue sur les nouveaux forums de MacGeneration. La peinture est encore fraiche, quelques boulons doivent être resserrés, plus d’informations demain !

Applescript : quitter toutes les applications ouverte

Mike4444

Membre junior
16 Juillet 2006
49
0
Lausanne
Bonjour,

Je souhaite créer un script permettant de quitter toutes les applications ouvertes.

N'y connaissant pas grand chose à Applescript, j'ai pioché ici ou là sur internet des bouts de code qui me donne quelque chose correct, mais pas parfait.

Mon script (cf. infra) est en deux parties : la première demande "gentiment" aux applications de bien vouloir quitter (sans sauver le document en cours), la seconde partie "tue" les applications récalcitrantes qui n'auraient pas compris la première demande "gentille".

Le problème : certaines applications, comme LibreOffice, refuse de quitter gentiment et bloque le script par un pop-up du genre "Où se trouve soffice ?"

Ma question : comment faire pour que l'exécution du script ne soit pas entravée par un pop-up d'un logiciel récalcitrant, mais continue, en passant par la phase 2, à savoir "tuer" ce même logiciel récalcitrant et son pop-up de malheur ?

Je précise : je pourrais garder uniquement la deuxième partie de mon script, celle qui tue toutes les applications, mais cela ne plairait pas à un logiciel comme Word qui, ensuite, lance son outil de récupération et veut envoyer les détails de l'incident à Microsoft. Je pourrais aussi tuer LibreOffice d'entrée de jeu en le ciblant spécifiquement, mais cela n'empêcherait pas un autre logiciel, tel ceux d'Adobe, de bloquer, à leur tour, la bonne marche du script. Bref, je vise un script qui s'adapte au plus grand nombre de cas.

D'avance, je vous remercie pour les réponses.

tell application "System Events" to set quitapps to name of every application process whose background only is false and name is not "Finder"

repeat with closeall in quitapps

quit application closeall without saving

end repeat


delay 5


tell application "System Events" to set pNames to name of every process


repeat with i from 1 to (count pNames)

set (item i of pNames) to quoted form of (item i of pNames)

end repeat


set {oAStid, AppleScript's text item delimiters} to {AppleScript's text item delimiters, " "}

set pNames to pNames as string

set AppleScript's text item delimiters to oAStid

try

do shell script ("killall " & pNames)

end try
 

zeltron54

Membre d’élite
29 Mars 2008
1 437
211
Lorraine
Bonjour,

Essai ce script, qui quitte toutes les applications en récupérant leurs id .

tell application "System Events"
set appList to bundle identifier of every application process ¬
whose background only is false and name is not "Finder"
end tell
repeat with cApp in appList
appList as text
quit application id cApp
end repeat
 

Mike4444

Membre junior
16 Juillet 2006
49
0
Lausanne
Bonjour,

Merci pour la réponse.

Avec LibreOffice, le script que vous proposez fonctionne, c'est-à-dire que LibreOffice tente bel et bien de quitter, dans les règles de l'art, sans avoir besoin d'être "tué". Néanmoins, ce logiciel affiche la boîte de dialogue demandant si l'on veut enregistrer le document, quand bien même j'ai ajouté "without saving" après "quit application id cApp". Or cette boîte de dialogue bloque également le script (comme le fait la fenêtre affichant "Où se trouve soffice ?").

Y a-t-il une autre façon que "without saving" ou "saving no" pour faire comprendre à LibreOffice qu'il peut quitter sans enregistrer ou, en cas de blocage, un moyen de passer outre ce blocage afin que la deuxième partie du script qui tue toutes les applications récalcitrantes s'exécute ?
 

zeltron54

Membre d’élite
29 Mars 2008
1 437
211
Lorraine
je n'ai pas" libre office" sur mon mac donc je ne peux pas tester.
Si "libre office" est scriptable peut être lui ajouter un petit script pour fermer sans enregistrer.
 

zeltron54

Membre d’élite
29 Mars 2008
1 437
211
Lorraine
je viens de tester avec Excel..
il suffit de tuer la tache avec un Kill
Donc voici un script modifié qui récupère les Pid des tâches et les quittent avec un kill , sauf le finder et quitte l'editeur de script en dernier.

tell application "System Events"
set appList to bundle identifier of every application process ¬
whose background only is false and name is not "Finder"
end tell
repeat with cApp in appList
appList as text

set ccApp to application id cApp as text

if ccApp is not "script editor" then
tell application "System Events" to set pid to the unix id of process ccApp
do shell script ("kill -9 " & pid)
end if
end repeat
quit application "Script Editor" -- Quitte editeur de script en dernier
 

Mike4444

Membre junior
16 Juillet 2006
49
0
Lausanne
Merci de votre nouvelle réponse.

La seconde partie du script que je mentionnais dans mon premier message avait déjà pour but de tuer les taches des applications récalcitrantes.
Mon souci principal est, dans un premier temps, de faire quitter les applications le plus proprement possible (donc d'éviter de les "tuer" d'entrée de jeu) et, dans un deuxième temps, de tuer les taches qui n'ont pas voulu quitter proprement.
Mon problème : lors de la première phase de mon script, durant laquelle les logiciels quittent proprement, certains logiciels récalcitrants (tel que LibreOffice, mais aussi ceux d'Adobe) viennent stopper le processus en cours, avant que celui-ci n'en vienne à la phase du "kill".
 

zeltron54

Membre d’élite
29 Mars 2008
1 437
211
Lorraine
Effectivement, pour ce problème je n'ai pas de solution, même excel attend gentiment avec la boite de dialogue que l'on réponde .
 

les_innommables66

Membre d’élite
Club MacG
26 Février 2006
1 093
107
Bonjour,

Deux idées qui me viennent :
- faire deux scripts, le premier qui essaye de tuer 'gentiment' et le second avec killall. Puis voir si avec Automator, par exemple, on peut lancer le script 1, attendre 30 secondes, puis lancer le script 2 ? Ou alors lancer les deux scripts en même temps mais prévoir 40 secondes d'attente au début du second ?
- plus compliqué : utiliser xCode qui sait travailler avec du AppleScript ; lancer la première tâche dans un "thread" spécifique, ce qui permettra de lancer la deuxième tâche même si la première est "bloquée".

Utile ?

Cordialement,
Nicolas
 

les_innommables66

Membre d’élite
Club MacG
26 Février 2006
1 093
107
Ou plus simple pour ma première idée une fois que tu as tes deux scripts : un 3e script qui a pour seule fonction de lancer les deux scripts ?
 

zeltron54

Membre d’élite
29 Mars 2008
1 437
211
Lorraine
Après quelques essais: il faut fermer la fenêtre des applications qui demandent d'enregistrer avec l'option "saving no" pour pouvoir les quitter sans message. Cela n'est possible que pour les applications scriptable avec applescript sinon on a une erreur:
Il faut donc: fermer les fenêtres dans un bloc " try " pour qu'en cas de demande sur une application non scriptable on continu en quittant l'application.


tell application "System Events"
set appList to bundle identifier of every application process ¬
whose background only is false and name is not "Finder"
end tell

repeat with cApp in appList
appList as text
set ccApp to application id cApp as text

try
tell application ccApp
activate
close windows saving no
end tell
end try

if ccApp is not "script Editor" then
quit application id cApp
end if

end repeat

quit --quitte editeur de script en dernier si pas de modif
 

OnyX

Membre émérite
Club MacG
31 Mai 2004
927
163
57
~/Desktop
www.titanium-software.fr
Pour quitter certaines applications, il faut utiliser la commande killall.
Si ça peut aider, morceau de code d'OnyX qui quitte toutes les applications, sauf OnyX :

on forceQuitApp(appli)
try
do shell script "killall" & space & appli
end try

end forceQuitApp


on quitAllApp()
forceQuitApp("'Adobe Photoshop CC 2015' WinAppHelper firefox-bin AdobeReader mozilla-bin seamonkey-bin thunderbird-bin JavaApplicationStub JavaAppLauncher soffice.bin 'Adobe Updater' prl_client_app prl_vm_app vncviewer")
delay 0.1
try
tell application "System Events" to set theapps to name of every application process whose visible is true and name is not "Finder"
set keepapp to {"OnyX"}
repeat with closeapp in theapps
if closeapp is not in keepapp then quit application closeapp
end repeat
end try
delay 0.1
end quitAllApp