piloter le terminal par applescript

mistertitan

Membre expert
Club iGen
4 Septembre 2003
1 175
132
43
Garches
www.400iso.org
je cherche quelqu'un qui pourrait corriger mon script: je cherche à effacer via le terminal un fichier recalcitrant grace à une variable qui enregistre le chemin d'accès.
mais l'intégration de cette variable ne fonctionne pas ca le terminal interprete
sudo "chemin d'accès" rm
au lieu de
sudo rm "chemin d'accès"

PLEASE HELP

voici la source de mon script:
<font color="red">
tell application "Terminal"
activate
repeat
display dialog "Entrer le chemin d'accès de l'élément à effacer" default answer "" buttons {"Cancel", "OK"} default button 2
set the search_string to the text returned of the result
if the search_string is not "" then exit repeat
end repeat
do script with command "sudo rm “" &amp; the search_string &amp; "” "
end tell
</font>
 
Bonjour,

Il y a 3 problèmes dans ton script :

1- Il faut passer le chemin d'accès au Terminal sous la forme unixienne. C'est ce que fait la commande 'POSIX path of'.

2- La commande des Standard Additions 'do shell script' semble plus fiable que le dictionnaire du Terminal. De plus, elle permet de passer ton mot de passe d'administrateur comme paramètre.

3- Le troisième n'est pas visible dans le code du script : le terminal interprète un espace comme une rupture dans la ligne de commande. Pour bien comprendre ce que j'ai du mal à expliquer : glisses un fichier (dont le nom comprend des espaces) sur une fenêtre du Terminal. Tu verras que chaque espace est précédé du caractère "\" (antislash). Il te faudra donc ajouter les antislashs par script.

--------------------------
set aFile to (choose file) as alias
set aPosix to POSIX path of aFile
do shell script ("sudo rm " &amp; aPosix) password "xxxx" with administrator privileges
--------------------------

Si le nom de ton fichier est exempt d'espaces, ça marche.

Cordialement aussi.
 
Bonjour,

Très intéressant ionah.
Une question : tu parle de la substitution des espaces, mais à ce moment la il faudrait en faire autant avec les éventuels caractères accentués ?

J'ai utilisé pas mal "do shell script" et je ne me rappelle pas avoir eut a substituer les espaces.

J'ai encadré toute la commande avec des quotes (') puis le path complet avec des guillemets ("). Comme dans mon exemple au dessus.

Cordialement



 
ouh là.... Attention! c'est dangereux la commande rm. Il ne faudrait pas qu'un path mal saisi conduise à effacer tout un dossier voire tout le disque! (je me rappelle d'une mise à jour d'iTunes diffusée par Apple qui avait ce genre de "petit" défaut...)

Personnellement lorsque j'ai un fichier récalcitrant, je préfère taper cette commande manuellement. (Ce n'est pas très long)

Je lance le terminal, je tapes sudo rm puis je glisse le fichier récalcitrant pour que son path se copie tout seul, puis je tapes echo envoi (pour d'abord vérifier que c'est bien seulement le fichier voulu qui va être supprimé).

Ensuite un coup de flèche vers le haut pour recopier la commande, je supprime echo et envoi
 
Si tu tiens à ton automatisation via Applescript, peut-être peux tu te contenter d'utiliser la comaande chmod pour modifier les droits d'accès sur le fichier récalcitrant et le supprimer ensuite via le Finder.

Ca me semble moins dangereux car au pire, en cas d'erreur de path tu modifieras les autorisations sur des fichiers qui n'étaient pas concernés, mais via Utilitaire Disque, SOS, réparer les autorisations tu pourras corriger le tir.
 
Bonjour à tous !

Il me semble que la commande 'rm ', lancée tel quel, ne permet pas de supprimer un dossier. Surtout s'il contient quelque chose. Il lui faut ajouter des paramètres. Sinon le Terminal renvoie une erreur du type "L'élément x n'est pas un fichier".
Et puis le 'choose file' permet d'être sûr de ce qu'on supprime. On peut aussi ajouter un 'display dialog' pour avertir/vérifier.

Quant aux espaces, Didier a raison : il suffit d'encadrer le 'POSIX path' par des guillemets. Le code devient donc :

Pour un fichier :
--------------------------
set aFile to (choose file) as alias
set aName to name of (info for aFile)

display dialog "Attention !
Cette commande est irréversible.
Etes-vous sûr(e) de vouloir supprimer définitivement le fichier “" &amp; aName &amp; "” ?" with icon 0 default button 1

set aPosix to (POSIX path of aFile) as text
do shell script ("sudo rm -dr " &amp; "\"" &amp; aPosix &amp; "\"") password "xxxx" with administrator privileges
--------------------------

Pour un dossier :
--------------------------
set aFile to (choose folder) as alias
set aName to name of (info for aFile)

display dialog "Attention !
Cette commande est irréversible.
Etes-vous sûr(e) de vouloir supprimer définitivement le dossier “" &amp; aName &amp; "” ?" with icon 0 default button 1

set aPosix to (POSIX path of aFile) as text
do shell script ("sudo rm -dr " &amp; "\"" &amp; aPosix &amp; "\"") password "xxxx" with administrator privileges
--------------------------

Toujours cordialement.
 
Didier Guillion a dit:
Bonjour,

Très intéressant ionah.
Une question : tu parle de la substitution des espaces, mais à ce moment la il faudrait en faire autant avec les éventuels caractères accentués ?

J'ai utilisé pas mal "do shell script" et je ne me rappelle pas avoir eut a substituer les espaces.

J'ai encadré toute la commande avec des quotes (') puis le path complet avec des guillemets ("). Comme dans mon exemple au dessus.

Cordialement

C'est la même chose directement dans le Terminal (logique vu que la on fait appelle au terminal), si on a un nom de dossier avec un espace u des caractères accentués il faut l'entourrer de "" ou mettre le caractère d'échapement \ devant. Au niveau des script c'est évidement une sécurité de mettre les "" autour d'un chemi d'accès
wink.gif
 
bonjour,

j'aimerais faire un applescript qui permettrait :
- de changer son ip via TOR
- d'aller une page web recupèrer des infos
- d'afficher ces données

Bon le problème c'est que pour l'instant je me suis débrouillé avec des "keystroke" partout mais le problème c'est que c'est lent alors j'aurais bien aimé piloter le terminal afin d'améliorer mon script.

Croyez-vous que ce soit possible?

Merci beaucoup