Ce forum est en partie financé par l’affichage de publicités. Merci de désactiver votre bloqueur de publicités pour nous permettre de continuer à fournir ce service.

Applescript : quitter toutes les applications ouverte

Discussion dans 'Utilitaires' créé par Mike4444, 21 Octobre 2016.

  1. Mike4444

    Mike4444 Membre junior

    Inscrit:
    16 Juillet 2006
    Messages:
    49
    J'aime reçus:
    0
    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
     
  2. zeltron54

    zeltron54 Membre d’élite

    Inscrit:
    29 Mars 2008
    Messages:
    1 373
    J'aime reçus:
    201
    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
     
  3. Mike4444

    Mike4444 Membre junior

    Inscrit:
    16 Juillet 2006
    Messages:
    49
    J'aime reçus:
    0
    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 ?
     
  4. zeltron54

    zeltron54 Membre d’élite

    Inscrit:
    29 Mars 2008
    Messages:
    1 373
    J'aime reçus:
    201
    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.
     
  5. zeltron54

    zeltron54 Membre d’élite

    Inscrit:
    29 Mars 2008
    Messages:
    1 373
    J'aime reçus:
    201
    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
     
  6. Mike4444

    Mike4444 Membre junior

    Inscrit:
    16 Juillet 2006
    Messages:
    49
    J'aime reçus:
    0
    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".
     
  7. zeltron54

    zeltron54 Membre d’élite

    Inscrit:
    29 Mars 2008
    Messages:
    1 373
    J'aime reçus:
    201
    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 .
     
  8. les_innommables66

    les_innommables66 Membre d’élite
    Club MacG

    Inscrit:
    26 Février 2006
    Messages:
    1 092
    J'aime reçus:
    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
     
  9. les_innommables66

    les_innommables66 Membre d’élite
    Club MacG

    Inscrit:
    26 Février 2006
    Messages:
    1 092
    J'aime reçus:
    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 ?
     
  10. zeltron54

    zeltron54 Membre d’élite

    Inscrit:
    29 Mars 2008
    Messages:
    1 373
    J'aime reçus:
    201
    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
     
  11. OnyX

    OnyX Membre émérite
    Club MacG

    Inscrit:
    31 Mai 2004
    Messages:
    926
    J'aime reçus:
    162
    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
     
Chargement...

iOccasion - Achetez un produit Apple d'occasion

refurb Apple