Quitter et réouvrir une application par AppleScript

Philippe49Philippe49 Membre
avril 2009 modifié dans Objective-C, Swift, C, C++ #1
Y-a-t-il un appleScripter dans le coin qui pourrait m'expliquer mon erreur dans le script suivant ?

set actualDocumentPath to path of front document of application &quot;Xcode&quot;<br /><br />tell application &quot;Xcode&quot; to quit<br /><br />tell application &quot;Xcode&quot;<br />	launch<br />	open actualDocumentPath<br />end tell

Réponses

  • Philippe49Philippe49 Membre
    21:48 modifié #2
    C'est curieux mais le même en intercalant des dialogues, cela fonctionne, comme si le script ne savait pas attendre que XCode soit complètement lancée pour exécuter l'instruction suivante ?

    <br />set actualDocumentPath to path of front document of application &quot;Xcode&quot;<br /><br />-- display dialog actualDocumentPath buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br /><br />tell application &quot;Xcode&quot; to quit<br /><br />display dialog actualDocumentPath buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br /><br />tell application &quot;Xcode&quot; to launch<br /><br />display dialog actualDocumentPath buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br /><br /><br />tell application &quot;Xcode&quot; to open actualDocumentPath<br />
    

  • AliGatorAliGator Membre, Modérateur
    21:48 modifié #3
    C'est bien possible étant donné que l'AppleScript, c'est un peu de langage de scripting, et beaucoup de pilotage... qui ne consiste quand on y pense qu'à  l'envoi d'AppleEvents... donc d'événements... d'où une composante asynchrone.

    Mais bon d'habitude il attend quand même...

    Tu peux intercaler une commande du genre
    repeat until (&quot;Xcode&quot; not in (current processes of application &quot;System Events&quot;)) with timeout 10 seconds<br />end repeat
    
    Je suis sûr que c'est pas comme ça que ça s'écrit en AS, faut regarder le dictionnaire de "System Events" pour retrouver le bon mot clé pour avoir la liste des process et attendre que Xcode ne soit plus dans la liste des processes ouvert... et pareil le "with timout" je crois qu'on peut le faire mais je ne me souviens plus de la syntaxe (c'est p'tet bien même plutôt sous la forme d'un bloc "with timeout"  qui encapsule ton repeat, je sais plus)... enfin tu vois l'idée.
  • Philippe49Philippe49 Membre
    avril 2009 modifié #4
    Il n'y a pas plus simple pour savoir si une appli est lancée ? du genre

    Je dis cela parce que repeat until "Xcode" in  processes of application "System Events" refuse l'accès (current non reconnu).
  • Philippe49Philippe49 Membre
    21:48 modifié #5
    Cela s'améliore avec
    repeat until application "Xcode" in processes of application "System Events"

    mais
    Erreur dans System Events : Il est impossible de rendre |processes| en type reference.
  • AliGatorAliGator Membre, Modérateur
    21:48 modifié #6
    Je t'avais dit que j'étais pas sûr de mon code et qu'il fallait vérifier dans le dico AppleScript :)

    Pour ma part je viens d'essayer ceci :
    on waitForProcess(prog, launched, maxTime)<br />	tell application &quot;System Events&quot;<br />		with timeout of maxTime seconds<br />			repeat<br />				set isLaunched to (prog is in name of application processes)<br />				if (isLaunched = launched) then return true<br />			end repeat<br />		end timeout<br />	end tell<br />end waitForProcess<br /><br />waitForProcess(&quot;Xcode&quot;, true, 5) of me
    
    Mais il a l'air de se fouttre de mon "with timeout" comme de l'an 40. Donc en alternative, je propose
    on waitForProcess(prog, launched, maxTime)<br />	tell application &quot;System Events&quot;<br />		set timeoutDate to (current date) + maxTime<br />		repeat until (current date) &gt; timeoutDate<br />			set isLaunched to (prog is in name of application processes)<br />			if (isLaunched = launched) then return true<br />		end repeat<br />		return false<br />	end tell<br />end waitForProcess<br /><br />waitForProcess(&quot;Xcode&quot;, true, 5) of me
    
    qui a l'air de marcher parfaitement chez moi... Je te laisse utiliser la fonction pour l'adapter à  ton cas ;)
  • Philippe49Philippe49 Membre
    21:48 modifié #7
    Pour ma part j'ai fait marcher l'attente par repeat try
    <br />set x to 0<br />set actualDocumentPath to &quot;null&quot;<br /><br />try<br />	set actualDocumentPath to path of front document of application &quot;Xcode&quot;<br />on error<br />	set x to 1<br />end try<br />----------------------------------------------<br />tell application &quot;Xcode&quot; to quit<br /><br />--display dialog actualDocumentPath buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br />----------------------------------------------<br />set y to 0<br />repeat while y = 0<br />	try<br />		tell application &quot;Xcode&quot; to launch<br />		set y to 1<br />	on error<br />		-- ne rien faire<br />	end try<br />end repeat<br />----------------------------------------------<br /><br /><br />--display dialog actualDocumentPath buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br /><br /><br />if x = 0 then<br />	tell application &quot;Xcode&quot; to open actualDocumentPath<br />end if
    


    cela marche très bien en script, pas dans XCode si un document est ouvert.

    Je regarde ton script de plus près.
  • Philippe49Philippe49 Membre
    avril 2009 modifié #8
    Même pb avec ta fonction, le display dialog permet le fonctionnement,
    sinon j'ai un message : Impossible de réaliser la connection avec XCode (image ci-dessous)

    <br />tell application &quot;Xcode&quot; to quit<br />display dialog &quot;quit&quot; buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br />tell application &quot;Xcode&quot; to launch<br />display dialog &quot;launch&quot; buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br />waitForProcess(&quot;Xcode&quot;, true, 5) of me<br />
    



    Pour faire fonctionner dans XCode la version repeat try du post précédent, je copie mon script dans un répertoire et par imitation avec le script Text > Convert Spaces ToTab, je lance par

    <br />#!/bin/sh<br /><br />osascript  ~/Library/Application&#092; Support/Developer/RelancerXCode.scpt<br />
    


    Le script activé depuis script editor marche dans tous les cas, le script lancé par XCode ne fonctionne pas si j'ai un projet ouvert .
  • AliGatorAliGator Membre, Modérateur
    21:48 modifié #9
    Et via Automator ?
  • Philippe49Philippe49 Membre
    21:48 modifié #10
    Là  je suis encore plus novice. Je ferme et rouvre XCode facilement, mais je ne vois pas ce qui permet de noter au passage le document courant.

  • AliGatorAliGator Membre, Modérateur
    21:48 modifié #11
    A vrai dire, moi aussi, très eu fait d'Automator... Mais il me semble qu'en plus de mettre des flux d'opérations, tu peux aussi y insérer des opérations... de type AppleScript (où tu rentres des bouts de code AppleScript directement plutôt que des opérations spécialisées)...

    Alors du coup je te le concède, c'est un peu capilotracté de passer par Automator pour faire... du code AppleScript finalement, mais d'une part tu peux mixer les 2 (action "quitter Xcode" et "lancer Xcode" en actons Automator, le reste en actions "code AppleScript"), et surtout c'est le process "Automator Runner" lui-même qui exécute le script, et plus Xcode, et donc potentiellement ça peut régler ton souci
  • Philippe49Philippe49 Membre
    21:48 modifié #12
    Bon un code qui "marche" (les guillements parce que franchement c'est du tâtonnements, et si ça a l'air de fonctionner maintenant qu'en sera-t-il demain ?)

    <br />on run<br />	set x to 0<br />	set actualDocumentPath to &quot;null&quot;<br />	<br />	try<br />		set actualDocumentPath to (path of front document of application &quot;Xcode&quot;)<br />	on error<br />		set x to 1<br />	end try<br />	----------------------------------------------<br />	-- return actualDocumentPath<br />	<br />	tell application &quot;Xcode&quot; to quit<br />	<br />	--display dialog actualDocumentPath buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br />	----------------------------------------------<br />	set y to 0<br />	repeat while y = 0<br />		try<br />			tell application &quot;Xcode&quot; to launch<br />			set y to 1<br />		on error<br />			-- ne rien faire<br />		end try<br />	end repeat<br />	----------------------------------------------<br />	<br />	<br />	--display dialog actualDocumentPath buttons {&quot;Don&#39;t know&quot;, &quot;OK&quot;} default button 2<br />	set z to 0<br />	repeat while z = 0<br />		try<br />			tell application &quot;Xcode&quot; to activate<br />			set z to 1<br />		end try<br />	end repeat<br />	<br />	<br />	if x = 0 then<br />		repeat while x = 0<br />			try<br />				tell application &quot;Xcode&quot; to open actualDocumentPath<br />				set x to 1<br />			end try<br />		end repeat<br />	end if<br />end run<br />
    


  • tabliertablier Membre
    21:48 modifié #13
    Chez moi le script ci-dessous marche sous l'éditeur et également comme application "exécutable uniquement".
    D'accord le "delay" est moins élégant qu'une boucle d'attente de fermeture, mais trois secondes ce n'est pas si long.
    try
    set actualDocumentPath to (path of front document of application "Xcode")
    on error lerreur
    display alert lerreur buttons {"Terminé"}
    return
    end try

    tell application "Xcode" to quit -- ajouter 'saving yes'  pour sauver le document
    delay 3

    try
    tell application "Xcode" to open actualDocumentPath
    on error lerreur
    display alert lerreur buttons {"Terminé"}
    end try

      ??? ça marche avec Xcode, mais pas forcément avec une autre application!
  • Philippe49Philippe49 Membre
    21:48 modifié #14
    Merci pour cette réponse !
Connectez-vous ou Inscrivez-vous pour répondre.