[Q] AppleScript : monter un disque et quitter des applis

Le
blanc
Bonjour à tous,

J'essaie d'écrire un script qui :
- monte un disque
- quitte une certain nombre d'applis (je n'en mets qu'une ci-dessous)
- lance une appli particulière (X-Plane) et quitte Finder pour finir.


Voici le script (partiel) :

-
tell application "Finder"
activate
if not (exists disk "Yad4") then
open "Vega:Users:jpb:scripts:monte_Yad4"
delay 10
end if
if not (exists disk "Yad4") then
exit
end if
end tell

tell application "Preview"
quit
end tell
[]

tell application "Finder"
open file "Yad4:Applications_Y4:X-Plane 9:X-Plane"
quit
end tell


Mes questions sont les suivantes :
- ligne 4 : je lance un shell-script pour monter le disque Yad4. Y
a-t-il une autre solution directement en AS ?
- ligne 5 : le "delay" est pour attendre que le disque soit monté. Y
a-t-il une autre solution ?
- ligne 8 : j'ai mis "exit" dans l'idée de terminer le script si le
disque n'a pas pu être monté. Mais AS me rajoute le mot clef "repeat".
Donc je suppose que ma commande n'est pas bonne. Que faut-il mettre à la
place de "exit" ?
- ligne 13 : Peut-on quitter une appli sans faire un "tell" à la dite
appli ?

Dans un autre script, je relance les applis ci-dessus quittées, et je
les cache :

--
tell application "Preview"
activate
end tell
[]
tell application "System Events"
try
set visible of process "Preview" to false
end try
[]
end tell
--

Est il possible de le faire plus simplement, sans avoir besoin de les
"activer" ?

--
JiPaul.
/ /--/--//\ Jean-Paul Blanc
|/| L |\ quelquepart en (somewhere in)
/|| = |||\ FRANCE
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrick Stadelmann
Le #23220311
In article (JiPaul) wrote:

- ligne 4 : je lance un shell-script pour monter le disque Yad4. Y
a-t-il une autre solution directement en AS ?



Ca dépend du type de disque. Dans certains cas, l'ouverture d'un alias
fonctionne.

- ligne 5 : le "delay" est pour attendre que le disque soit monté. Y
a-t-il une autre solution ?



Une boucle :

set tmax to 10
tell application "Finder"
repeat until (disk "Yad4" exists)
delay 1
set tmax to tmax - 1
if tmax = 0 then exit repeat
end repeat
end tell

- ligne 8 : j'ai mis "exit" dans l'idée de terminer le script si le
disque n'a pas pu être monté. Mais AS me rajoute le mot clef "repeat".
Donc je suppose que ma commande n'est pas bonne. Que faut-il mettre à la
place de "exit" ?



"exit" c'est pour sortir d'une boucle repeat, pour sortir d'un handler,
c'est "return" (avec une valeur de retour optionnelle).

- ligne 13 : Peut-on quitter une appli sans faire un "tell" à la dite
appli ?



Non.

Est il possible de le faire plus simplement, sans avoir besoin de les
"activer" ?



Utiliser "to run" à la place, ça les lance en arrière-plan (mais il
faudra quand même les masquer).

Patrick
--
Patrick Stadelmann
blanc
Le #23223171
Merci Patrick pour tes réponses toujours aussi rapides, précises
et pertinentes :-)

Patrick Stadelmann
> - ligne 4 : je lance un shell-script pour monter le disque Yad4. Y
> a-t-il une autre solution directement en AS ?

Ca dépend du type de disque. Dans certains cas, l'ouverture d'un alias
fonctionne.



OK. Bon chez moi, fonctionne pas ;-(

> - ligne 5 : le "delay" est pour attendre que le disque soit monté. Y
> a-t-il une autre solution ?

Une boucle :

set tmax to 10
tell application "Finder"
repeat until (disk "Yad4" exists)
delay 1
set tmax to tmax - 1
if tmax = 0 then exit repeat
end repeat
end tell



OK. Ça marche.


> - ligne 8 : j'ai mis "exit" dans l'idée de terminer le script si le
> disque n'a pas pu être monté. Mais AS me rajoute le mot clef "repeat".
> Donc je suppose que ma commande n'est pas bonne. Que faut-il mettre à la
> place de "exit" ?

"exit" c'est pour sortir d'une boucle repeat, pour sortir d'un handler,



C'est bien ce que j'avais subodorré :-)

c'est "return" (avec une valeur de retour optionnelle).



Comment n'y ai je pas pensé ? :-/


> - ligne 13 : Peut-on quitter une appli sans faire un "tell" à la dite
> appli ?

Non.

> Est il possible de le faire plus simplement, sans avoir besoin de les
> "activer" ?

Utiliser "to run" à la place, ça les lance en arrière-plan (mais il
faudra quand même les masquer).



Comprends pas bien la syntaxe à utiliser ...

--
JiPaul.
/ /--/--//\ Jean-Paul Blanc
|/| L |\ quelquepart en (somewhere in)
/|| = |||\ FRANCE
Patrick Stadelmann
Le #23223161
In article (JiPaul) wrote:

> Utiliser "to run" à la place, ça les lance en arrière-plan (mais il
> faudra quand même les masquer).

Comprends pas bien la syntaxe à utiliser ...



tell application "TextEdit" to run

Et il semble que maintenant, ça n'ouvre plus l'application en
arrière-plan, mais masquée.

Patrick
--
Patrick Stadelmann
blanc
Le #23223801
Patrick Stadelmann
tell application "TextEdit" to run

Et il semble que maintenant, ça n'ouvre plus l'application en
arrière-plan, mais masquée.



Effectivement... sauf que certaines applis s'ouvrent quand même au
premier plan. Pas grave, je les masque après.

Ah au fait j'ai trouvé entre temps d'autres syntaxes :
run application "TextEdit"
launch application "TextEdit"

mais même cette dernière qui ne devrait pas lancer complètement l'appli
(donc la laisser cachée si j'ai bien compris), m'ouvre une fenêtre dans
le cas de BoincManager !...

Merci encore. :-)

--
JiPaul.
/ /--/--//\ Jean-Paul Blanc
|/| L |\ quelquepart en (somewhere in)
/|| = |||\ FRANCE
Patrick Stadelmann
Le #23223861
In article (JiPaul) wrote:

mais même cette dernière qui ne devrait pas lancer complètement l'appli
(donc la laisser cachée si j'ai bien compris), m'ouvre une fenêtre dans
le cas de BoincManager !...



Visiblement il y a eu des changements avec AppleScript 2.0, il faudrait
regarder dans le Language Guide ce qui est prévu précisément pour ces
commandes (mais comme tu l'as constaté, elles supposent que
l'application les respectent, ce que l'OS ne peut pas imposer).

Patrick
--
Patrick Stadelmann
blanc
Le #23226001
Patrick Stadelmann
Visiblement il y a eu des changements avec AppleScript 2.0, il faudrait
regarder dans le Language Guide ce qui est prévu précisément pour ces
commandes (mais comme tu l'as constaté, elles supposent que
l'application les respectent, ce que l'OS ne peut pas imposer).



Je viens de lire une bonne partie du Language guide. Mais beaucoup de
chose me semble encore hermétique.
Pourquoi ce qui suit ne marche-t-il pas ?

tell application "Finder"
repeat with iwin in list of every window
set nwin to title of window iwin
if nwin is equal to "XPLANE9" then
close iwin
end if
end repeat
end tell


--
JiPaul.
/ /--/--//\ Jean-Paul Blanc
|/| L |\ quelquepart en (somewhere in)
/|| = |||\ FRANCE
Patrick Stadelmann
Le #23226261
In article (JiPaul) wrote:

Pourquoi ce qui suit ne marche-t-il pas ?

tell application "Finder"
repeat with iwin in list of every window



"every window" est une liste (contenant des éléments de type "window").
Ca n'a pas de sens de mettre "list of" devant. Donc plutôt :

repeat with iwin in every window

Cette syntaxe fonctionne par exemple avec TextEdit :

tell application "TextEdit"
class of item 1 of every window
end tell

--> window

Donc, pour TextEdit, les éléments de "every window" sont chacune des
fenêtres ouvertes. Par contre, avec le Finder, on obtient par exemple :

tell application "Finder"
class of item 1 of every window
end tell

--> {document file, folder, folder}

En regardant en détail, on voit qu'il s'agit du premier élément de
chacune des trois fenêtres ouvertes dans mon exemple. Donc pour le
Finder, les éléments de "every window" sont les éléments contenus par
les fenêtres. Il faut forcer la conversion en une liste de fenêtre :

tell application "Finder"
class of item 1 of (every window as list)
end tell

--> Finder window

Donc la 2e ligne de ton script doit être :

repeat with iwin in (every window as list)

set nwin to title of window iwin



"title" n'est pas une propriété de la class "window", il est compilé
comme une variable. Il faut utiliser "name". De plus, "iwin" est une
fenêtre, pas un index, donc :

set nwin to name of iwin

Le reste devrait être OK.

Patrick
--
Patrick Stadelmann
blanc
Le #23226401
Patrick Stadelmann
"every window" est une liste (contenant des éléments de type "window").
Ca n'a pas de sens de mettre "list of" devant. Donc plutôt :

repeat with iwin in every window

Cette syntaxe fonctionne par exemple avec TextEdit :

tell application "TextEdit"
class of item 1 of every window
end tell

--> window

Donc, pour TextEdit, les éléments de "every window" sont chacune des
fenêtres ouvertes. Par contre, avec le Finder, on obtient par exemple :

tell application "Finder"
class of item 1 of every window
end tell

--> {document file, folder, folder}



C'est ça que je reproche à AS : c'est tantôt ceci, tantôt cela.
Difficile de s'y retrouver... et surtout d'apprendre ce « langage ».

En regardant en détail, on voit qu'il s'agit du premier élément de
chacune des trois fenêtres ouvertes dans mon exemple. Donc pour le
Finder, les éléments de "every window" sont les éléments contenus par
les fenêtres. Il faut forcer la conversion en une liste de fenêtre :

tell application "Finder"
class of item 1 of (every window as list)
end tell

--> Finder window

Donc la 2e ligne de ton script doit être :

repeat with iwin in (every window as list)



Bon OK.


> set nwin to title of window iwin

"title" n'est pas une propriété de la class "window", il est compilé
comme une variable. Il faut utiliser "name". De plus, "iwin" est une
fenêtre, pas un index, donc :

set nwin to name of iwin

Le reste devrait être OK.



Effectivement ça marche. Tu es vraiment très fort, et moi j'ai encore
beaucoup à apprendre.

Une dernière question (enfin, j'espère) : ces scripts en fait je les
utilises dans Spark (afin d'avoir des raccourcis pour les lancer). J'ai
ces 4 lignes (la deuxième a été pliée en trois) :
tell application "Finder"
display dialog "On lance X-Plane ?" ¬
buttons {"Non", "OK"} default button "OK" ¬
cancel button "Non"
if dialogresult is "Non" then return
end tell

Lorsque j'exécute en cliquant sur "exécuter" dans Spark, j'ai bien le
dialogue. Mais lorsque je lance avec le raccourci, il n'apparaît pas (et
le script est bloqué jusqu'à la fin du TimeOut).

As-tu une idée du pourquoi ?

--
JiPaul.
/ /--/--//\ Jean-Paul Blanc
|/| L |\ quelquepart en (somewhere in)
/|| = |||\ FRANCE
blanc
Le #23226461
JiPaul
Lorsque j'exécute en cliquant sur "exécuter" dans Spark, j'ai bien le
dialogue. Mais lorsque je lance avec le raccourci, il n'apparaît pas (et
le script est bloqué jusqu'à la fin du TimeOut).



Autant pour moi, ça marche : apparemment il était juste caché sous
Spark. Mais le curieux, c'est qu'il n'apparaissait pas avec exposé.

--
JiPaul.
/ /--/--//\ Jean-Paul Blanc
|/| L |\ quelquepart en (somewhere in)
/|| = |||\ FRANCE
blanc
Le #23226451
JiPaul
Lorsque j'exécute en cliquant sur "exécuter" dans Spark, j'ai bien le
dialogue. Mais lorsque je lance avec le raccourci, il n'apparaît pas (et
le script est bloqué jusqu'à la fin du TimeOut).

As-tu une idée du pourquoi ?



Bon voilà. C'est corrigé : il suffisait de rajouter un "activate".
J'avais oublié que c'était dans un "tell to Finder". Du fait il
n'apparraissait que lorsque le Finder était devant.
Il reste cependant deux questions :
- pourquoi un "F9" d'exposé ne le montre pas ?
- pourquoi n'est-il pas possible de faire un tel dialogue de
confirmation en dehors du Finder ?
--
JiPaul.
/ /--/--//\ Jean-Paul Blanc
|/| L |\ quelquepart en (somewhere in)
/|| = |||\ FRANCE
Publicité
Poster une réponse
Anonyme