Encapsuler un shell script avec AS
Bonjour,
je suis tout débutant en applescript (mais à l'aise en shell).
Je peux m'adapter à applescript (à partir de mon expérience dans d'autres langages).
Aussi, si vous connaissez des exemples de code applescript proches de ce dont j'ai besoin, plutôt que de vous embêter à corriger ce que j'ai fait, n'hésitez à m'indiquer des références!
Voilà le problème: ma copine voudrait avoir une copie de l'un de ses répertoires sur sa clé USB.
Je me suis dit que c'était facile à faire en shell script avec la commande rsync, mais il ne faudrait pas qu'elle ait à lancer un Terminal pour taper des commandes à la main (faut pas exagérer quand même (on est sur un mac!))!
Question 1: est-ce que applescript est le plus adapté pour "encapsuler" du shell dans une application cliquable?
J'ai commencé par faire une petite appli qui est censée, dans un premier temps, montrer les fichiers qui vont être copiés vers la clé (car nouveaux ou modifiés) ou supprimés de la clé (car supprimés du répertoire original):
(Attention les yeux! c'est mon premier script! :oops: merci d'être indulgents! (mais néanmoins de me corriger si nécessaire :P))
Code:
1 2 3 4 5
| set from_dir to quoted form of "/Users/Stef/Desktop/Documents Stef/école"
set to_dir to quoted form of "/Volumes/KINGSTON/Stef/RSYNC"
set cmd to "/usr/bin/rsync -nrv --delete " & from_dir & " " & to_dir
display dialog (do shell script cmd) |
ça marche presque! :) à quelques détails près! :?
Il affiche une boite de dialogue qui est trop étroite (comme la fameuse marge) pour contenir les lignes qui sont malencontreusement repliées (à environ 45 caractères)! :roll:
Question 2: peut-on spécifier la largeur de la boite de dialogue? Faut-il utiliser autre chose que "dialog"?
Et surtout le codage des caractères est pas top 8O (je lui avais pourtant dit de ne pas mettre d'accents dans ses noms de fichiers et répertoires!:rouleau:). En gros, voilà ce que ça affiche (je l'ai copié de la partie "Réponses" de l'éditeur Applescript, mais c'est la même chose qui est affichée dans la boite de dialogue):
Code:
1 2 3 4 5 6 7 8
| \\#303\\#251cole/
\\#303\\#251cole/.DS_Store
\\#303\\#251cole/Calendriers Excel
\\#303\\#251cole/Programmation HistGeoC3.pdf
\\#303\\#251cole/Affichages ecole/
\\#303\\#251cole/Affichages ecole/.DS_Store
\\#303\\#251cole/Affichages ecole/Affiches-francais/
etc. |
:calim2:
(quand ça marchera, je grep'erai -v les .DS_Store)
J'ai bien essayé de piper la sortie du shell script à travers toutes sortes de 'iconv' (de/vers utf8, de/vers iso8859-1, de/vers macRoman), mais cela ne change rien à l'affichage (ce que je trouve pour le moins bizarre, car ça change tout lorsque exécuté depuis le Terminal)! Par exemple:
Code:
set cmd to "/usr/bin/rsync -nrv --delete " & from_dir & " " & to_dir & " | iconv -f ISO-8859-1 -t UTF-8"
Question 3: comment peut-on gérer les accents des noms de fichiers retournés par un shell script?
Et, enfin, le nombre de lignes affichées est limité par la hauteur du dialog.
Question 4: peut-on afficher une liste de lignes de texte avec une scrollbar? Faut-il utiliser autre chose que "dialog"?
Pour l'instant, je n'ai pas d'autre problème (j'ai bien dit "pour l'instant"! ;)).
Merci d'avance pour toute aide, pointeur, etc.! :P
)jack(
Encapsuler un shell script avec AS
Bonsoir Jack-ft,
Que de questions...!
1) le dialog : L'interface utilisateur est une des limitations de AppleScript. Le "Display Dialog" est en effet assez limité. Pour passer outre cette limite, il faut en général passer par un autre mode de programmation (Xcode par exemple).
Ceci étant, il y a plus pratique pour gérer une liste, tout en gardant Applescript:
l'instruction Choose from list dont voici un exemple ci-dessous :
Code:
1 2
|
set Mylist to choose from list {"item1", "item2, "item3"} with title "Liste des items" with prompt "Sélectionner les items" default items {"item2"} OK button name "Sélectionner" cancel button name "Abandonner" with multiple selections allowed and empty selection allowed |
Imagine que dans ton cas, les noms des fichiers soient repris dans une liste. Tu affiches cette liste (pré-sélectionnée avec default items).
Malheureusement, si cela permettra à l'utilisateur de changer sa sélection, cela est limité par la largeur de la fenêtre. AppleScript essaie de tenir compte des largeurs des lignes, mais ce n'est pas toujours parfait.
Reste à pouvoir récupérer tes lignes de terminal sous forme de liste.
Note que cela réponds aussi à ta question 4 : le choose list intègre une gestion du scrollbar.
2) Gestion du retour du Terminal
le retour du terminal se fait en général par un :
Code:
1 2
|
set Mon_Texte to do shell script "xxxx" |
Tu récupères dans Mon_Texte une variable de type texte qui peut être manipulée (par exemple : "set T to paragraph 1 of Mon_texte" te donne la première ligne. Dans une boucle, tu peux traiter chaque ligne.
3) le problème des accents
il peut y avoir des accents et d'autres caractères spéciaux. Le Shell et l'interface Mac font automatiquement une traduction, transparente à l'utilisateur. En script, il faut le faire soit même !
Pour cela 2 instructions peuvent être utiles (à utiliser dans ta boucle par ligne) :
1) POSIX file qui transforme un chemin/fichier d'Unix en AppleScript
2) quoted form qui permet de gérer les caractères spéciaux
Exemple :
Set A to quoted form of POSIX file of (Mon_Fichier) as string
assigne à A, la valeur unix (dossier/sous dossier///Mon_Fichier) à partir de Mon_Fichier (avec la valeur Finder/script dossier:dossier:::Mon_Fichier)
Dans cet exemple, les accents, les \, etc... seront aussi transcodés.
A essayer lors de la récupération du résultat de ton instruction shell pour présenter seulement les fichiers à l'utilisateur (en retirant le path tu réduis le problème de largeur du dialogue
En espérant t'avoir aidé
Cordialement