Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

20 réponses
Avatar
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

10 réponses

1 2
Avatar
Patrick Stadelmann
In article <1jyfozq.vjcyyomu2hhgN%,
(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
Avatar
blanc
Merci Patrick pour tes réponses toujours aussi rapides, précises
et pertinentes :-)

Patrick Stadelmann 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.



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
Avatar
Patrick Stadelmann
In article <1jyi44d.1n9htll2ixl4wN%,
(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
Avatar
blanc
Patrick Stadelmann wrote:

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
Avatar
Patrick Stadelmann
In article <1jyixxs.qenquaqs0N%,
(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
Avatar
blanc
Patrick Stadelmann wrote:

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
Avatar
Patrick Stadelmann
In article <1jyjyt5.14eb34b1v01kyuN%,
(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
Avatar
blanc
Patrick Stadelmann wrote:

"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
Avatar
blanc
JiPaul wrote:

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
Avatar
blanc
JiPaul wrote:

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
1 2