Automator lance un script shell dans terminal

radar

Membre actif
20 Février 2005
215
8
47
Bonjour (et meilleurs voeux pour cette année 2011),

j'ai un script qui renomme les sous-titres que je télécharge avec le même nom que le fichier vidéo auquel il est associé. Cependant, mon script n'est pas parfait et demande parfois de l'aide via ligne de commande. J'aimerais bien qu'à l'arrivée d'un fichier téléchargé à partir d'un certain site, Automator ouvre une fenêtre Terminal dans laquelle il fait tourner un script dont l'argument est le fichier en question.
Pour le lancement d'Automator en fonction de la provenance du fichier, je sais faire (dans les infos des fichiers téléchargés, on peut accéder au site de provenance), mais je n'arrive pas à ouvrir une fenêtre Terminal qui exécute mon mon script avec le fichier en question comme argument.
Une idée ?

Merci d'avance.
 
Bonsoir,

L'action "Exécuter un script Shell" permet de faire cela sans ouvrir le Terminal.

Mets ce code dans l'action "Exécuter un script Shell".
Bloc de code:
for f in "$@"
do
	"~/Mon_script.sh" "$f"
done
Modifie le chemin ~/Mon_script.sh par celui de ton script

Sélectionne "/bin/bash" et "comme arguments" dans les popup de l'action.

C'est tout.
 
Merci pour ta réponse.
Mais je cherche justement à ce qu'une fenêtre de Terminal soit ouverte.
OK, c'est l'action "Exécuter un script AppleScript" qui sera utilisée.
Mets ce code dans l'action :
Bloc de code:
on run {input, parameters}
	set script_path to quoted form of "/Users/jack/Desktop/suprime Accents.pl" -- à remplacer par le chemin de ton script Shell
	
	repeat with i in input
		if class of i is alias then set i to i as Unicode text
		if i does not start with "/" then set i to POSIX path of i
		tell application "Terminal"
			activate
			do script script_path & " " & quoted form of i
		end tell
	end repeat
	return input
end run
 
Bon, ce script fait exactement ce que j'ai demandé. Mais, puisqu'il doit toujours y en avoir un (mais), je me suis trompé dans ma demande :)
Ce que j'aimerais faire est :
À l'arrivée d'un fichier .zip dans mon répertoire de téléchargements, un script perl se lance. Il va juste vérifier la source du fichier. S'il provient d'un site de sous-titres (sous-titres.eu, opensubtitles, etc), il ouvre un terminal dans lequel il exécute un autre script perl.
Pourquoi deux scripts ? Tout simplement pour ne pas lancer la fenêtre de terminal si la source du fichier ne m'intéresse pas. L'idéal aurait été d'utiliser les dossiers intelligents avec Automator, mais ce n'est pas possible.
Après, si quelqu'un connaît un moyen d'ouvrir une fenêtre de terminal à partir d'une commande shell, je suis preneur.
 
Ce que j'aimerais faire est :
À l'arrivée d'un fichier .zip dans mon répertoire de téléchargements, un script perl se lance. Il va juste vérifier la source du fichier. S'il provient d'un site de sous-titres (sous-titres.eu, opensubtitles, etc), il ouvre un terminal dans lequel il exécute un autre script perl.

Voici la solution pour lancer un script dans le terminal à partir d'un script perl :

1- Utilise la solution du message#2 pour exécuter ton premier script perl.

2- Voici le code à ajouter dans ton script perl, il ouvre une fenêtre du Terminal, lance l'autre script perl avec comme paramètre le chemin du fichier
Bloc de code:
 if ( blabla) {
    system("/usr/bin/osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script  quoted form of \"/Users/jack/Desktop/mon Script.pl\" & space & quoted form of \"$chemin\"' -e 'end tell'");
}
$chemin est une variable perl qui contient le chemin du fichier.
remplace /Users/jack/Desktop/mon Script.pl par le chemin de ton deuxième script perl
 
Merci beaucoup. J'avais trouvé une solution équivalente en créant un premier script Perl qui appelle un AppleScript qui lance un Terminal dans lequel il exécute le second script Perl. Ta solution est plus élégante, elle me permet de réduire le nombre de fichiers. Merci beaucoup.
Deux autres questions :
  1. Sais-tu comment faire pour que la fenêtre de Terminal se ferme à la fin de l'exécution du script ? Que ce soit une commande dans mon script Perl lui-même ou dans l'AppleScript.
  2. Mes actions de dossier sur le répertoire de téléchargements sont un peu bizarres. Lorsque c'est activé, ça fait clignoter l'écran à chaque fois qu'un nouvel élément y est mis. En plus, l'action de dossier se comporte normalement si un seul fichier est téléchargé. Si plusieurs le sont à intervalle court, seuls quelques uns sont traités. Comme si le temps de traitement du premier fichier masque l'arrivée des autres.

Merci encore pour toute l'aide que tu m'as apportée.
 
Bonjour,

Sais-tu comment faire pour que la fenêtre de Terminal se ferme à la fin de l'exécution du script ? Que ce soit une commande dans mon script Perl lui-même ou dans l'AppleScript.
Le plus simple est de sélectionner “fermer si le shell s’est arrêté correctement” lorsque que le shell quitte : dans les préférences du Terminal --> onglets "Réglages" --> onglets "Shell".
Et de mettre ;exit à la fin du do script, comme ceci
Bloc de code:
 if ( blabla) {
    system("/usr/bin/osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script  (quoted form of \"/Users/jack/Desktop/mon Script.pl\") & space & (quoted form of \"$chemin\") & \";exit\"' -e 'end tell'");
}

La modification de cette préférence ne fermera pas la fenêtre si l'utilisateur tape ou exécute une commande ou par une commande AppleScript sans le ;exit



--
Mes actions de dossier sur le répertoire de téléchargements sont un peu bizarres. Lorsque c'est activé, ça fait clignoter l'écran à chaque fois qu'un nouvel élément y est mis. En plus, l'action de dossier se comporte normalement si un seul fichier est téléchargé. Si plusieurs le sont à intervalle court, seuls quelques uns sont traités. Comme si le temps de traitement du premier fichier masque l'arrivée des autres.
Oui, c'est un problème, pour le diminuer ajuste le temps de l'intervalle des actions de dossier (Léopard ou plus récent)
Voici un script AppleScript qui ajuste l'intervalle (à ne faire qu'une seule fois sur la machine)
Bloc de code:
tell application "/System/Library/CoreServices/Folder Actions Dispatcher.app" to set polling interval to 1


Une autre solution est de vérifier le contenu du dossier par exemple les fichiers zip.
ceci fonctionne si les zip sont déplacés dans un autre dossier ou supprimés au début du traitement.

Automator (pour les actions de dossier) enregistre un script AppleScript dans le dossier "/Bibliothèque/Scripts/Folder Action Scripts" dans ta maison, voici un exemple de code à ajouter au début de ce script.
Bloc de code:
on adding folder items to this_folder after receiving added_items
	try
		tell application "Finder" to set tfiles to (document files whose name extension is "zip") as alias list
		if tfiles is not {} then set added_items to added_items & tfiles
	end try
 
Bonjour,


Le plus simple est de sélectionner “fermer si le shell s’est arrêté correctement” lorsque que le shell quitte : dans les préférences du Terminal --> onglets "Réglages" --> onglets "Shell".
Et de mettre ;exit à la fin du do script, comme ceci
Bloc de code:
 if ( blabla) {
    system("/usr/bin/osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script  (quoted form of \"/Users/jack/Desktop/mon Script.pl\") & space & (quoted form of \"$chemin\") & \";exit\"' -e 'end tell'");
}

La modification de cette préférence ne fermera pas la fenêtre si l'utilisateur tape ou exécute une commande ou par une commande AppleScript sans le ;exit
OK. Merci. J'y ai pensé et j'aurais dû tester. Je pensais qu'elle fermerait aussi la fenêtre à chaque commande qui se termine correctement.

Oui, c'est un problème, pour le diminuer ajuste le temps de l'intervalle des actions de dossier (Léopard ou plus récent)
Voici un script AppleScript qui ajuste l'intervalle (à ne faire qu'une seule fois sur la machine)
Bloc de code:
tell application "/System/Library/CoreServices/Folder Actions Dispatcher.app" to set polling interval to 1


Une autre solution est de vérifier le contenu du dossier par exemple les fichiers zip.
ceci fonctionne si les zip sont déplacés dans un autre dossier ou supprimés au début du traitement.

Automator (pour les actions de dossier) enregistre un script AppleScript dans le dossier "/Bibliothèque/Scripts/Folder Action Scripts" dans ta maison, voici un exemple de code à ajouter au début de ce script.
Bloc de code:
on adding folder items to this_folder after receiving added_items
	try
		tell application "Finder" to set tfiles to (document files whose name extension is "zip") as alias list
		if tfiles is not {} then set added_items to added_items & tfiles
	end try
Si je comprends bien, je suis obligé de faire une action de dossier sur le répertoire contenant les .zip. Le problème revient un peu au même : si je télécharge plusieurs zip, seulement le premier sera mis dans le répertoire. À moins que je n'aie pas vraiment compris ton intention.

---------- Nouveau message ajouté à 20h25 ---------- Le message précédent a été envoyé à 20h07 ----------

Ça marche parfaitement, modulo les aléas des action folder.
Merci beaucoup.
 
J'ai oublié de spécifier le dossier (this_folder ) dans le code AppleScript de l'action de dossier.

C'est
Bloc de code:
tell application "Finder" to set tfiles to (document files of  this_folder  whose name extension is "zip") as alias list
Sinon, le dossier par défaut sera le Bureau
 
Un autre oubli, pour ne pas avoir de doublons avec les éléments ajoutés.

Voici le script corrigé
Bloc de code:
on adding folder items to this_folder after receiving added_items
	try
		tell application "Finder" to set tfiles to document files of this_folder whose name extension is "zip"
		repeat with i in tfiles
			set t_zip to i as alias
			if t_zip is not in added_items then set end of added_items to t_zip
		end repeat
	end try