IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Assignation automatique d'une action de dossier aux sous-dossiers


Sujet :

AppleScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Assignation automatique d'une action de dossier aux sous-dossiers
    Bonjour...

    Je fais appel à vos lumières après avoir éprouvé quelques difficultés à utiliser le script décrit ici...

    J'aimerais que dans un dossiers donné nommé "Test script" soit assigné comme action de dossier "renomauto.workflow" à chaque nouveau dossier créé...

    J'ai donc utilisé le deuxième script et y ai ajouté une ou deux lignes pour comprendre où sa bloque (Lignes 19, 21 & 30)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    -- Ce script est déclenché par une action de dossier "add item" sur le dossier parent
    -- si l'action est un l'ajout d'un sous-dossier,
    -- alors ce script assigne une action de dossier prédéfinie à ce nouveau sous-dossier
    -- © PBell 2012-05 
     
    on adding folder items to Mon_Dossier after receiving Liste_Fichiers
     
    	-- Mettre ici le nom du script à ajouter à la création d'un sous-dossier
    	-- Ce script doit exister dans votre Folder Action Script !!
    	set Script_sous_Dossier to "renomauto.workflow"
     
    	-- Récupération du chemin par défaut des Folder Action Scripts dans le domaine utilisateur
    	tell application "System Events" to set Dossier_Scripts to ¬
    		(path to Folder Action scripts folder from user domain) as string
    	set Mon_Script to (Dossier_Scripts & Script_sous_Dossier)
     
    	-- Vérification que le script prédéfini existe. Sinon, on quitte le script !
    	tell application "Finder"
    		display dialog "Chemin =" & Mon_Script & return & "Liste nouveaux dossiers =" & Liste_Fichiers
    		if not (exists file Mon_Script) then return
    		display dialog "existe"
     
    		-- Boucle sur chaque item ajouté = un ou plusieurs sous-dossiers)
    		repeat with Un_Item in Liste_Fichiers
    			if (kind of Un_Item) is "dossier" then
    				-- C'est un dossier, on ajoute l'action de dossier
    				tell application "System Events" to attach action to Un_Item as alias ¬
    					using (Mon_Script as string)
     
    				tell application "Finder" to display dialog "Ok pour" & Un_Item
    			end if
    		end repeat -- fin de boucle sur les items ajoutés		
     
    	end tell
    end adding folder items to
    Lors de la création d'un nouveau dossier "dossier sans titre" j'obtiens donc deux boites de dialogue :
    Chemin =Macintosh HD:Users:Charles:Library:Scripts:Folder Action Scripts:renomauto.workflow
    Liste nouveaux dossiers =Macintosh HD:Users:Charles:Movies:Test script:dossier sans titre:
    Le chemin du script semble correct, le nouveau dossier également...

    J'obtient ensuite une deuxième boite de dialogue "existe", signifiant que l'action de dossier est bien trouvée, et ensuite plus rien...
    Evidement l'action de dossier n'est pas assignée...

    Quelqu'un aurait une piste pour m'aider ?
    Ce code ne marche t'il plus à cause d'OSX El Capitan ?

    En attendant une solution je vous remercie par avance pour votre aide...

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Je n'ai pas remarqué de différence avec El Capitain, excepté que les scripts et actions de dossiers ne peuvent plus être mis dans le dossier bibliothèque racine du disque, désormais protégé. Ils doivent uniquement être mis dans la bibliothèque de l'utilisateur (donc pour chaque user).

    Donc ton script devrait fonctionner sans problème... à condition que ton script d'action de dossier ajouté soit un script AppleScript !
    Or, ce n'est pas le cas : c'est un script Automator.

    La différence est le chemin utilisé par Apple (oui, c'est dommage, mais ... !)
    Les scripts AppleScript d'action de dossier sont dans :~Library:Scripts:Folder Action Scripts
    Les workflow Automator d'action de dossier sont dans :~Library:Workflows:Applications:Folder Actions

    Dans ton cas, tu as changé l'emplacement par défaut du script Automator du second au premier dossier (Automator enregistre par défaut dans le workflow)

    Le script d'exemple écrit en 2012 est basé sur des scripts AppleScripts.
    Pour l'adapter à des scripts Automator, il suffit de changer :
    - remettre ton Workflow dans le dossier ~Library:Workflows:Applications:Folder Actions
    - corriger la ligne 13 : je n'ai pas trouvé de terme AS pour le dossier des workflow action folder, donc tu vas le mettre "en dur" en remplaçant la ligne 13 par la ligne ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tell application "System Events" to set Dossier_Scripts to ((path to workflows folder from user domain) as string) & "Applications:Folder Actions:"

    Cordialement

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse rapide, j'avais pensé que ça venait peut-être de là lors de mes différents essais pour résoudre le problème, j'avais remplacé mon script automator par un des applescript fourni par Apple sans qu'il ne soit pour autant affecté lui non plus aux sous-dossiers, j'avais donc conclu que ça ne venait pas forcément de là... ^^

    J'ai donc remplacé le script attaché au dossier parent par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    -- Ce script est déclenché par une action de dossier "add item" sur le dossier parent
    -- si l'action est un l'ajout d'un sous-dossier,
    -- alors ce script assigne une action de dossier prédéfinie à ce nouveau sous-dossier
    -- © PBell 2012-05 
     
    on adding folder items to Mon_Dossier after receiving Liste_Fichiers
     
    	-- Mettre ici le nom du script à ajouter à la création d'un sous-dossier
    	-- Ce script doit exister dans votre Folder Action Script !!
    	set Script_sous_Dossier to "renomauto.workflow"
     
    	-- Récupération du chemin par défaut des Folder Action Scripts dans le domaine utilisateur
    	tell application "System Events" to set Dossier_Scripts to ((path to workflows folder from user domain) as string) & "Applications:Folder Actions:"
    	set Mon_Script to (Dossier_Scripts & Script_sous_Dossier)
     
    	-- Vérification que le script prédéfini existe. Sinon, on quitte le script !
    	tell application "Finder"
    		display dialog "Chemin =" & Mon_Script & return & "Liste nouveaux dossiers =" & Liste_Fichiers
    		if not (exists file Mon_Script) then return
    		display dialog "existe"
     
    		-- Boucle sur chaque item ajouté = un ou plusieurs sous-dossiers)
    		repeat with Un_Item in Liste_Fichiers
    			if (kind of Un_Item) is "dossier" then
    				-- C'est un dossier, on ajoute l'action de dossier
    				tell application "System Events" to attach action to Un_Item as alias ¬
    					using (Mon_Script as string)
     
    				tell application "Finder" to display dialog "Ok pour" & Un_Item
    			end if
    		end repeat -- fin de boucle sur les items ajoutés		
     
    	end tell
    end adding folder items to
    J'obtiens toujours le bon chemin du script automator et du nouveau dossier créé...
    Chemin =Macintosh HD:Users:Charles:Library:Workflows:Applications:Folder Actions:renomauto.workflow
    Liste nouveaux dossiers =Macintosh HD:Users:Charles:Movies:Test script:dossier sans titre:
    Ainsi que la boite de dialogue confirmant l'existence du workflow à l'endroit ou il doit être, mais ça s'interrompt toujours là...

    Après le workflow n'est pas en soit indispensable sous ce format et je pense que je pourrais sans doute le remplacer par un applescript, il se contente de lancer un autre processus automator lequel effectue une série de remplacements dans le nom des fichiers et contient également un applescript pour masquer les extensions des fichiers, tout ça pouvant également j'imagine être assez simplement remplacé par un applescript...
    Je ne vois d'ailleurs plus la raison pour laquelle m'étais apparu utile hier de passer par cette étape intermédiaire et ne pas assigné directement aux dossiers le script automator qui contient les informations concernant le changement de nom des fichiers... Peut-être parce que le premier script automator est un service et que pour le second j'ai besoin d'une action de dossier...

    Pour récapituler avant qu'on s'y perde... Jusqu'alors j'avais besoin d'un script automator qui change le nom de certains fichiers, je choisissais le ou les fichiers et sélectionnais par clic droit le service en question. J'aimerai maintenant également en conservant cette possibilité, pouvoir dans un dossier assigner aux sous-dossiers qu'il contient (qui évoluent d'où le besoin d'assignation automatique) un script qui renommera automatiquement les fichiers contenus par ces sous dossiers...

    Je vais essayer de simplifier la deuxième partie mais je n'arrive toujours pas malgré tes conseils à faire fonctionner cette assignation automatique d'action de dossier... :/

  4. #4
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Citation Envoyé par Ckarsenti Voir le message
    J'obtiens toujours le bon chemin du script automator et du nouveau dossier créé...
    Ainsi que la boite de dialogue confirmant l'existence du workflow à l'endroit ou il doit être, mais ça s'interrompt toujours là...
    /
    Essaye de mettre une trace en ligne 26 pour vérifier si le test If kind = dossier est positif.

    Cordialement

    PS : pour le reste, j'essaie de regarder ce soir, si je trouve un peu de temps

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    -- Ce script est déclenché par une action de dossier "add item" sur le dossier parent
    -- si l'action est un l'ajout d'un sous-dossier,
    -- alors ce script assigne une action de dossier prédéfinie à ce nouveau sous-dossier
    -- © PBell 2012-05 
     
    on adding folder items to Mon_Dossier after receiving Liste_Fichiers
     
    	-- Mettre ici le nom du script à ajouter à la création d'un sous-dossier
    	-- Ce script doit exister dans votre Folder Action Script !!
    	set Script_sous_Dossier to "renomauto.workflow"
     
    	-- Récupération du chemin par défaut des Folder Action Scripts dans le domaine utilisateur
    	tell application "System Events" to set Dossier_Scripts to ((path to workflows folder from user domain) as string) & "Applications:Folder Actions:"
    	set Mon_Script to (Dossier_Scripts & Script_sous_Dossier)
     
    	-- Vérification que le script prédéfini existe. Sinon, on quitte le script !
    	tell application "Finder"
    		display dialog "Chemin =" & Mon_Script & return & "Liste nouveaux dossiers =" & Liste_Fichiers
    		if not (exists file Mon_Script) then return
    		display dialog "existe"
     
    		-- Boucle sur chaque item ajouté = un ou plusieurs sous-dossiers)
    		repeat with Un_Item in Liste_Fichiers
    			if (kind of Un_Item) is "dossier" then
    				tell application "Finder" to display dialog "Ok"
    				-- C'est un dossier, on ajoute l'action de dossier
    				tell application "System Events" to attach action to Un_Item as alias ¬
    					using (Mon_Script as string)
     
    				tell application "Finder" to display dialog "Ok pour" & Un_Item
    			end if
    		end repeat -- fin de boucle sur les items ajoutés		
     
    	end tell
    end adding folder items to
    Là j'obtiens un "ok" en plus mais ça s'arrête toujours, donc ça doit bloquer encore après...
    Merci pour ton aide en tout cas, j'ai commencé à transformer le reste pour que ça soit moins bancal...

    Pour l'instant je pars sur un script qui effectue les remplacements "Renom.scpt" et un service automator qui l'appelle... Après quelques recherches à droite à gauche j'ai réussi à confectionner en utilisant des bouts de script trouvé ça et là ceci :

    Le service automator récupère et exécute le script "Renom.scpt" ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    on run {input, parameters}
     
    	set path1 to "Volumes:Macintosh HD:Users:Charles:Library:Scripts:Folder Action Scripts:Renom.scpt"
    	set UnixPath to POSIX path of quoted form of path1
     
    	do shell script "/usr/bin/osascript " & UnixPath
    	return input
    end run
    Renom.scpt contenant pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    set theFiles to choose file with multiple selections allowed
     
    tell application "System Events"
    	repeat with thisFile in the theFiles
    		set oldFileName to name of thisFile
    		-- Suppression éléments nom --
    		set {oldTID, my text item delimiters} to {my text item delimiters, {"- ", "_"}}
    		set fileNameBits to text items of oldFileName
     
    		set my text item delimiters to ""
    		set newFileName to fileNameBits as text
     
    		set my text item delimiters to oldTID
     
    		set name of thisFile to newFileName
     
    		-- Masquage extension --
    		tell application "Finder"
    			set extension hidden of the thisFile to true
    		end tell
    	end repeat
    end tell
    Il faut encore que j'arrive à remplacer la première ligne par autre chose...
    Pour l'instant quand je lance le service par clic-droit sur un fichier à renommer la première ligne fait que finder me demande de sélectionner le fichier à traiter, et à ajouter une deuxième fonction pour les noms. Pour l'instant le script supprime les "-" et "_", mais j'ai aussi besoin de remplacer certains éléments par d'autres "AB" par "AA" par exemple...

    Je suis donc à la recherche de cette fameuse ligne qui définira theFiles comme les fichiers sélectionnés par clic droit lorsque c'est le service qui appel le script, ou les fichiers contenus dans le sous-dossiers quand c'est l'action de dossier qui le mettra en route...
    Je sais pas si c'est possible mais je chercher ^^

    En cas merci encore :)

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Je n'ai toujours pas réussi à trouver par quoi remplacer la première ligne pour définir correctement "theFiles" comme étant les fichiers soumis soit par clic droit via le service automator soit contenus dans le sous-dossier via l'action de dossier...

    J'ai par contre réussi à ajouter la fonction de remplacement d'un terme par un autre, sans doute pas de la façon la plus élégante mais ça marche donc, il doit y a voir une cinquantaine d'éléments à supprimer et une dizaine à remplacer donc si je ne trouve pas mieux, ça devrait quand même être plus léger que l'ancien script automator...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    set theFiles to choose file with multiple selections allowed
    tell application "System Events"
    	repeat with thisFile in the theFiles
    		set ancienNomFichier to name of thisFile
     
    		-- Suppression éléments nom --
    		set {ancienTID, my text item delimiters} to {my text item delimiters, {"-", "_"}}
    		set texteNomFichier to text items of ancienNomFichier
    		set my text item delimiters to ""
    		set nouveauNomFichier to texteNomFichier as text
    		set my text item delimiters to ancienTID
    		set name of thisFile to nouveauNomFichier
     
    		-- Remplacement 1 --
    		set {ancienTID2, my text item delimiters} to {my text item delimiters, {"AA"}}
    		set texteNomFichier2 to text items of nouveauNomFichier
    		set my text item delimiters to "BB"
    		set nouveauNomFichier2 to texteNomFichier2 as text
    		set my text item delimiters to ancienTID2
    		set name of thisFile to nouveauNomFichier2
     
    		-- Remplacement 2 --
    		set {ancienTID3, my text item delimiters} to {my text item delimiters, {"CC"}}
    		set texteNomFichier3 to text items of nouveauNomFichier2
    		set my text item delimiters to "DD"
    		set nouveauNomFichier3 to texteNomFichier3 as text
    		set my text item delimiters to ancienTID3
    		set name of thisFile to nouveauNomFichier3
     
    		-- Masquage extension --
    		tell application "Finder"
    			set extension hidden of the thisFile to true
    		end tell
    	end repeat
    end tell

  7. #7
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,


    Citation Envoyé par Ckarsenti Voir le message
    Je n'ai toujours pas réussi à trouver par quoi remplacer la première ligne pour définir correctement "theFiles" comme étant les fichiers soumis soit par clic droit via le service automator soit contenus dans le sous-dossier via l'action de dossier...



    Je crois que je commence à comprendre ce que tu veux faire :
    Tu as une routine qui change le nom des fichiers (pas sûr d'avoir compris ta logique de changement !) et qui cache leur extension.


    Tu veux pouvoir appeler cette routine soit via un service (j'imagine click droit sur une sélection de fichiers dans le Finder) soit lorsque des fichiers sont ajoutés dans un dossier (action folder).


    Dans ce cas, le plus simple est de créer cette routine séparément, ce sera plus simple pour la maintenance future (si tu veux changer la méthode de changement des noms).
    Tu appelles cette routine dans le script Service et dans le script d'action de dossier en lui transmettant comme paramètre la liste des fichiers.


    Je prends un exemple pas à pas:


    Voici la routine de changement de nom. J'ai simplifié, pour l'exemple, mais à toi de compléter avec tes item text delimiters !
    Tu enregistres ce script où tu veux. Dans mon exemple, je l'ai mis sur le bureau, sous le nom "Change_Nom.Scpt".
    Il faut peut être que tu distingues, dans la boucle, si un_Fichier est de type Dossier ou pas ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- cette routine est un script séparé (voir load script commande)
    on Change_Nom(les_Fichiers) -- routine de changement de fichiers
       repeat with un_Fichier in les_Fichiers
    -- determine nouveau nom
            tell application "Finder" to set A to name of un_Fichier
            tell application "Finder"
               set Ancien to name of un_Fichier
               set Nouveau to Ancien-- juste pour l'exemple !
               set name of un_Fichier to NouveauNom
               set extension hidden of the thisFile to true
            end tell
        end repeat
    end Change_Nom




    Voici maintenant l'action de dossier à placer dans le folder action script.
    Celle-ci appelle le premier script pour utiliser la fonction Change_Nom avec, comme paramètre, la liste des fichiers ajoutés.
    N'oublie pas de modifier éventuellement le chemin vers ton fichier Change_nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    on adding folder items to Mon_Dossier after receiving Liste_Fichiers
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set Ma_Lib to (load script file "Users:imac27:Desktop:Change_Nom.scpt")
       tell Ma_Lib to Change_Nom(Liste_Fichiers)
    end adding folder items to




    Voici enfin le dernier script, qui peut être appelé via un service. Ici, pour l'exemple, j'ai ajouté une demande de selection de fichiers, mais cette instruction peut être remplacée par la récupération d'une liste de fichiers d'un Service, ou encore d'une selection du Finder (tell application "Finder" to Set theFiles to selection) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    on run
       set theFiles to choose file with multiple selections allowed
        set Ma_Lib to (load script file "Users:imac27:Desktop:Change_Nom.scpt")
       tell Ma_Lib to Change_Nom(theFiles)
    end run


    Une fois que tu as mis cela en place, toutes les modifications ultérieures de ton script de changement de nom se feront uniquement dans le script Change_Nom. Chaque modification sera de fait immédiatement validée pour le Service et l'action de dossier ! Gain de temps...


    Cordialement

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Je te remercie une fois de plus pour ton aide... Je suis désolé pour le délai de réponse, je suis devenu papa un peu plus tôt que prévu et ensuite avec noel j'ai eu encore un peu plus la tête sous l'eau...

    Citation Envoyé par PBELL Voir le message
    Tu as une routine qui change le nom des fichiers (pas sûr d'avoir compris ta logique de changement !) et qui cache leur extension.
    Je crois que je commence à comprendre ce que tu veux faire :
    J'ai trouvé le script pour modifier les noms au hasard de mes recherches sur Google je suis pas sûr qu'il soit le plus simple et le plus élégant mais je suis incapable de faire mieux par moi même...
    Comme j'ai vu en cherchant des solutions à mes différents problèmes sur le forum que tu aimais bien avoir une compréhension exhaustive du problème pour tenter d'y apporter une solution, je vais essayer d'expliquer plus clairement ce que j'aimerai arriver à faire... ^^

    Actuellement j'ai un script automator que j'appelle par un service Finder par clic droit. Il effectue une série de changements dans le nom des fichiers puis en masque l'extension.
    Les modifications sont de deux types :
    - Suppression d'éléments devenus inutiles (une cinquantaine pour l'instant comme la résolution du fichier, sa version, le nom de la dernière personne intervenue dessus, etc...)
    - Et modification d'éléments mal renseignés (deux ou trois seulement pour l'instant) ou devenus obsolètes (comme transformer l'état d'avancement de non achevé à fini).

    Pour prendre un exemple simplifié, un fichier qui s'appelle avant de passer dans le service :
    "Fichier.V5.1024x768.Toto.A finir.avi"
    Devient :
    "Fichier - V5 - Fini".
    Il supprime donc ".1024x768" & ".Toto", et remplace ".V" par "- V" & ".A finir" par "- Fini" et masque d'extension.

    Les fichiers sont contenus dans des sous-dossiers créés soit par une application soit par le propriétaire du fichier directement, sous-dossiers eux mêmes contenus dans un "dossier parent" et s'organisent ainsi :

    "Dossier Parent" → "Sous-dossiers 1" → "Fichier 1", "Fichier 2"
    "Dossier Parent" → "Sous-dossiers 2" → "Fichier 3"
    "Dossier Parent" → "Sous-dossiers 3" → "Fichier 4", "Fichier 6", "Fichier 7", "Fichier 8", "Fichier 9", "Fichier 10"


    Citation Envoyé par PBELL Voir le message
    Tu veux pouvoir appeler cette routine soit via un service (j'imagine click droit sur une sélection de fichiers dans le Finder) soit lorsque des fichiers sont ajoutés dans un dossier (action folder).
    Oui. En ajoutant à cela en plus une action de dossier au "Dossier parent" qui assignerait automatiquement l'action de dossier qui appelle le script de changement de nom aux sous-dossiers qui contiennent eux-mêmes les fichiers...

    Donc en suivant tes conseils j'aurais :
    • Une action folder pour le dossier parent qui assigne aux sous dossiers l'action folder suivante
    • Une action folder pour les sous-dossiers qui appelle le script de changement de nom
    • Un service finder pour les fichiers isolés qui appelle le script de changement de nom
    • Le script de changement de nom lui-même


    Citation Envoyé par PBELL Voir le message
    Dans ce cas, le plus simple est de créer cette routine séparément, ce sera plus simple pour la maintenance future (si tu veux changer la méthode de changement des noms).
    Tu appelles cette routine dans le script Service et dans le script d'action de dossier en lui transmettant comme paramètre la liste des fichiers.
    C'est ce que j'ai essayé de faire dans mes derniers essais mais que tu sembles avoir codé avec plus d'élégance et en utilisant une fonction... ^^

    J'ai donc fait des modifications en fonction de tes conseils pour obtenir... :

    1. Une action folder pour le dossier parent (FAS_Dossier_parent.scpt)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      on adding folder items to Mon_Dossier after receiving Liste_Fichiers
       
      	-- Mettre ici le nom du script à ajouter à la création d'un sous-dossier
      	-- Ce script doit exister dans votre Folder Action Script !!
      	set Script_sous_Dossier to "FAS_Sous_dossiers.scpt"
       
      	-- Récupération du chemin par défaut des Folder Action Scripts dans le domaine utilisateur
      	tell application "System Events" to set Dossier_Scripts to ¬
      		(path to Folder Action scripts folder from user domain) as string
      	set Mon_Script to (Dossier_Scripts & Script_sous_Dossier)
       
      	-- Vérification que le script prédéfini existe. Sinon, on quitte le script !
      	tell application "Finder"
      		display dialog "Chemin =" & Mon_Script & return & "Liste nouveaux dossiers =" & Liste_Fichiers
      		if not (exists file Mon_Script) then return
      		display dialog "OK 1"
      		-- Boucle sur chaque item ajouté = un ou plusieurs sous-dossiers)
      		repeat with Un_Item in Liste_Fichiers
      			display dialog "OK 2"
      			if (kind of Un_Item) is "dossier" then
      				-- C'est un dossier, on ajoute l'action de dossier
      				display dialog "OK 3"
      				tell application "System Events" to attach action to Un_Item as alias ¬
      					using (Mon_Script as string)
      			end if
      			display dialog "OK 4"
      		end repeat -- fin de boucle sur les items ajoutés
      		display dialog "OK 5"
      	end tell
      end adding folder items to
    2. Une action folder pour les sous-dossiers qui appelle le script de changement de nom (FAS_Sous_dossiers.scpt) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      on adding folder items to Mon_Dossier after receiving Liste_Fichiers
      	set Ma_Lib to (load script file "Users:Charles:Library:Scripts:Folder Action Scripts:Change_nom.scpt")
      	tell Ma_Lib to Change_Nom(Liste_Fichiers)
      end adding folder items to
    3. Un service finder pour les fichiers isolés qui appelle le script de changement de nom
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      on run
      	tell application "Finder" to set theFiles to selection
      	set Ma_Lib to (load script file "Users:Charles:Library:Scripts:Folder Action Scripts:Change_nom.scpt")
      	tell Ma_Lib to Change_Nom(theFiles)
      end run
    4. Le script de changement de nom lui-même (Change_nom.scpt)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
       
      on Change_Nom(les_Fichiers) -- routine de changement de fichiers
       
      	tell application "System Events"
      		repeat with un_Fichier in les_Fichiers
      			tell application "Finder" to display dialog "Ok pour 1"
       
      			-- Masquage extension --
      			tell application "Finder"
      				set extension hidden of the un_Fichier to true
      				tell application "Finder" to display dialog "Extension Ok"
      			end tell
       
       
      			-- determine nouveau nom
      			set ancienNomFichier to name of un_Fichier
      			tell application "Finder" to display dialog "Ok pour 2"
      			-- Suppression éléments nom --
      			set {ancienTID, my text item delimiters} to {my text item delimiters, {".1024x768", ".1024x600", ".toto"}}
      			set texteNomFichier to text items of ancienNomFichier
      			set my text item delimiters to ""
      			tell application "Finder" to display dialog "Ok pour 3"
      			set nouveauNomFichier to texteNomFichier as text
      			set my text item delimiters to ancienTID
      			set name of un_Fichier to nouveauNomFichier
      			tell application "Finder" to display dialog "Ok pour 4"
       
      			-- Remplacement 1 --
      			set {ancienTID2, my text item delimiters} to {my text item delimiters, {".V", ".Version ", ".V.", }}
      			set texteNomFichier2 to text items of nouveauNomFichier
      			set my text item delimiters to "- V"
      			set nouveauNomFichier2 to texteNomFichier2 as text
      			set my text item delimiters to ancienTID2
      			set name of thisFile to nouveauNomFichier2
       
      			-- Remplacement 2 --
      			set {ancienTID3, my text item delimiters} to {my text item delimiters, {".A finir", ".Non achevé", ".Terminé"}}
      			set texteNomFichier3 to text items of nouveauNomFichier2
      			set my text item delimiters to "- FINI"
      			set nouveauNomFichier3 to texteNomFichier3 as text
      			set my text item delimiters to ancienTID3
      			set name of thisFile to nouveauNomFichier3
       
      		end repeat
      		tell application "Finder" to display dialog "Ok pour 6"
      	end tell
       
      end Change_Nom


    En terme de problèmes restant...

    Les deux points du milieux semblent fonctionner (Le script & le service qui appellent le script Change_nom.scpt) par contre les deux autres me posent encore problème.

    FAS_Dossier_Parent.scpt bloque toujours. Il s'arrête après "OK 3" sans que je ne comprenne pourquoi, ça n'est pas une partie de ton script à laquelle j'ai touchée.

    Change_nom.scpt
    Fonctionne lorsqu'il est appelé par le script, mais lorsqu'il est appelé par le service finder si je n'enlève pas les parties "Remplacement 1" et "Remplacement 2" j'obtiens une erreur dans le finder, j'imagine que ça vient de mon codage peu élaboré et de ma faible compréhension de ce qu'on peut faire ou non avec les text item delimiters...

    Je vais essayer de travailler ces deux derniers points entre deux changements de couches mais si tu as une piste tu recevras à nouveau toute ma gratitude... ^^
    En attendant je te souhaite de bonnes fêtes, et encore merci...

  9. #9
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Félicitations au papa (et à la maman !).

    Citation Envoyé par Ckarsenti Voir le message
    Change_nom.scpt
    Fonctionne lorsqu'il est appelé par le script, mais lorsqu'il est appelé par le service finder si je n'enlève pas les parties "Remplacement 1" et "Remplacement 2" j'obtiens une erreur dans le finder, j'imagine que ça vient de mon codage peu élaboré et de ma faible compréhension de ce qu'on peut faire ou non avec les text item delimiters...
    Dans mon exemple, les changements se font sur la variable un_Fichier (dans la liste les_Fichiers).
    Mais tes lignes 34 et 42 font toujours référence à ton ancienne variable thisfile, qui n'est pas déclarée. Donc ce script donne toujours une erreur sur ces lignes.
    Lorsqu'un script est appelé en action de dossier, le système ne t'affiche jamais les erreurs, c'est sans doute pour cela que tu ne le vois pas.
    Pour ces 2 lignes, il faut remplacer thisfile par un_Fichier.
    Mais le second problème est que lorsque tu fais le premier changement, la référence au fichier est changée. Donc le second changement ne s'y retrouve pas.
    Ayant maintenant compris ta logique de changement, il est plus judicieux d'appeler une autre sous-routine "Remplace".
    Cette routine est appelée 3 fois, à chaque fois avec une liste de valeurs à remplacer par une seule nouvelle valeur.
    Le changement se fait sur une variable NouveauNom qui n'est assignée au fichier qu'à la fin (donc avec tous les changements éventuellement faits !).

    Voici le script corrigé : (j'ai laissé tous tes display dialog pour que tu puisses voir !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    on Change_Nom(les_Fichiers) -- routine de changement de fichiers
        
        repeat with un_Fichier in les_Fichiers
            tell application "Finder" to display dialog "Ok pour 1"
    -- Masquage extension --
            tell application "Finder"
                set extension hidden of the un_Fichier to true
                tell application "Finder" to display dialog "Extension Ok"
            end tell
            
    -- determine nouveau nom
            set ancienNomFichier to name of un_Fichier
            tell application "Finder" to display dialog "Ok pour 2"
    -- Suppression éléments nom --
            set NouveauNom to Remplace(ancienNomFichier, {".1024x768", ".1024x600", ".toto"}, "")
            tell application "Finder" to display dialog "Ok pour 3"
    -- Remplacement 1 --
            set NouveauNom to Remplace(NouveauNom, {".V", ".Version ", ".V."}, "- V")
            tell application "Finder" to display dialog "Ok pour 4"
    -- Remplacement 2 --
            set NouveauNom to Remplace(NouveauNom, {".A finir", ".Non achevé", ".Terminé"}, "- FINI")
            tell application "Finder" to display dialog "Ok pour 5, nouveau nom=" & NouveauNom
            
            tell application "System Events" to set name of un_Fichier to NouveauNom
            
        end repeat
        tell application "Finder" to display dialog "Ok pour 6"
    end Change_Nom
    
    
    on Remplace(Nom, Liste, Nouveau) -- remplace dans le Nom, les élements de la Liste par Nouveau
        set {ancienTID, my text item delimiters} to {my text item delimiters, Liste}
        set TempNom to text items of Nom
        set my text item delimiters to Nouveau
        set Nom to TempNom as text
        set my text item delimiters to ancienTID
        return Nom
    end Remplace

    Je pense en outre que cette version est plus lisible, donc plus facile à modifier dans l'avenir.

    Quant à la partie assignation d'action de dossier, je dois re-tester plus tard chez moi et je te confirmerai dès que possible

    Bonnes fêtes !

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,
    Félicitations au papa (et à la maman !).
    Merci ^^

    Dans mon exemple, les changements se font sur la variable un_Fichier (dans la liste les_Fichiers).
    Mais tes lignes 34 et 42 font toujours référence à ton ancienne variable thisfile, qui n'est pas déclarée. Donc ce script donne toujours une erreur sur ces lignes.
    Lorsqu'un script est appelé en action de dossier, le système ne t'affiche jamais les erreurs, c'est sans doute pour cela que tu ne le vois pas.
    Pour ces 2 lignes, il faut remplacer thisfile par un_Fichier.
    Mais le second problème est que lorsque tu fais le premier changement, la référence au fichier est changée. Donc le second changement ne s'y retrouve pas.
    En effet c'est moi qui suis un peu étourdi, pour ma défense je ne dors pas beaucoup ces derniers jours... J'avais commencé à tester uniquement avec la première partie pour laquelle j'avais pensé à modifier les anciennes variables et après avoir constaté que ça fonctionnait, au moment de rajouter les deux remplacements suivants j'ai oublié de les modifier aussi... ^^

    Ayant maintenant compris ta logique de changement, il est plus judicieux d'appeler une autre sous-routine "Remplace".
    Cette routine est appelée 3 fois, à chaque fois avec une liste de valeurs à remplacer par une seule nouvelle valeur.
    Le changement se fait sur une variable NouveauNom qui n'est assignée au fichier qu'à la fin (donc avec tous les changements éventuellement faits !).
    J'ai essayé de faire quelque chose dans ce genre hier en me disant que ça serait peut-être plus simple et éviterait des erreurs mais sans y arriver du tout, alors encore une fois merci ^^

    J'ai donc testé, tout marchait très bien, j'allais venir crier victoire et sortir le clairon mais j'avais oublié de tester l'appel du script change_nom via l'action de dossier... Avec le service tout marche parfaitement, avec l'action de dossier ça bloque après le masquage d'extension. J'ai fait un nouveau test en supprimant les petits ajouts que j'avais fais sur le script en reprenant tel quel le script que tu as écris hier ça bloque toujours... Si je supprime le masquage d'extension ça bloque encore et toujours, à partir de la ligne 12 donc...

    Je vais commencer à me demander si les actions de dossiers n'ont pas quelque chose contre moi... :p

    Pour ce qui est de l'action de dossier du dossier parent, j'ai refais des tests avec le script tel que je l'ai joint hier, si ça n'est pas un dossier ça va jusqu'au bout et j'obtient le "ok 5", si c'est un dossier ça bloque à la ligne 23

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tell application "System Events" to attach action to Un_Item as alias ¬
    					using (Mon_Script as string)
    			end if
    J'ai rajouté un test avant le end if il ne s'affiche pas...

    J'ai également testé sur un compte utilisateur vierge au cas où il pourrait y avoir d'étranges interactions avec quelque chose et les tests n'ont pas été plus concluants...

  11. #11
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,

    Citation Envoyé par Ckarsenti Voir le message
    Pour ce qui est de l'action de dossier du dossier parent, j'ai refais des tests avec le script tel que je l'ai joint hier, si ça n'est pas un dossier ça va jusqu'au bout et j'obtient le "ok 5", si c'est un dossier ça bloque à la ligne 23
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tell application "System Events" to attach action to Un_Item as alias ¬
                        using (Mon_Script as string)
                end if
    J'ai rajouté un test avant le end if il ne s'affiche pas...

    Comme promis, j'ai regardé et surtout beaucoup testé et "googler" pour trouver la solution.
    En fait, depuis Snow Leopard, Apple a fait quelques changements dans les actions de dossiers. J'ai même lu, sans pouvoir le vérifier de source sûre, que Apple se désintéressait peu à peu des actions de dossier pour remplacer par des launchd...
    ...Si une bonne âme a trouvé une confirmation ou infirmation de la Pomme, merci !
    Donc Apple a changé: l'instruction "attach action" ne génère pas d'erreur de compilation, mais n'est plus implémentée sur Yosemite et El Capitain !
    Sous Snow Leopard c'est toujours OK. Je ne sais pas pour Lion et Mountain Lion ?

    Il faut maintenant passer via 2 instructions, l'une pour créer l'action de dossier, l'autre pour mettre le script. Je précise que le script n'est plus assigné avec son chemin complet, mais juste son nom, ce qui confirme que Apple veut limiter l'emplacement possible de ce script au seul dossier prévu, et pas ailleurs... Ce n'est pas plus mal.

    Donc pour en revenir à ton script, c'est bien le "attach action" qui est la cause du problème.
    Et voici une nouvelle écriture du script FAS_Dossier_parent conforme à Yosemite (sans doute El Capitain: à confirmer).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    on adding folder items to Mon_Dossier after receiving Liste_Fichiers
    -- Mettre ici le nom du script à ajouter à la création d'un sous-dossier
    -- Ce script doit exister dans votre Folder Action Script !!
        set Script_sous_Dossier to "FAS_Sous_dossiers.scpt"
        
    -- Récupération du chemin par défaut des Folder Action Scripts dans le domaine utilisateur
        tell application "System Events" to set Dossier_Scripts to ¬
            (path to Folder Action scripts folder from user domain) as string
        set Mon_Script to (Dossier_Scripts & Script_sous_Dossier)
        
        tell application "Finder"
    -- Vérification que le script prédéfini existe. Sinon, on quitte le script !
            if not (exists file Mon_Script) then
                display dialog "Le script " & Script_sous_Dossier & " n'est pas installé."
                return
            end if
    -- Boucle sur chaque item ajouté = un ou plusieurs sous-dossiers)
            repeat with Un_Item in Liste_Fichiers
                if (kind of Un_Item) is "Dossier" then
    -- C'est un dossier, on ajoute l'action de dossier
                    tell application "System Events"
                        set Dos_Nom to name of Un_Item
    make new folder action at end of folder actions with properties {enabled:true, name:Dos_Nom, path:Un_Item}
                        tell folder action Dos_Nom to make new script at end of scripts with properties {name:Script_sous_Dossier}
                    end tell
                end if
            end repeat -- fin de boucle sur les items ajoutés
        end tell
    end adding folder items to
    J'ai testé et tout fonctionne.

    Cordialement

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Ca fonctionne impeccablement sous El Capitan en tout cas...

    Je vais finir par te demander ton adresse et t'envoyer une boite de chocolat pour te remercier de tout le mal que tu t'ai donné pour m'aider...

    C'est quand même fou d'être une firme capable de dépenser des millions en spot de pub TV, mais de n'être capable de communiquer qu'à coup de lance pierre en ce qui concerne les modifications apportés au coeur du système...

    Le script change_nom fonctionne également chez toi lorsqu'il est appelé par l'action de dossier ? Chez moi ça s'arrête toujours après le masquage de l'extension, mais fonctionne jusqu'au bout lorsqu'il est appelé par le service... Apple nous à encore joué un mauvais tour à ce niveau ?
    J'essayerais de refaire des tests et de chercher dans ce sens demain, en attendant je te souhaite une bonne fin d'année 2015...

    Merci encore.

  13. #13
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Citation Envoyé par Ckarsenti Voir le message
    Le script change_nom fonctionne également chez toi lorsqu'il est appelé par l'action de dossier ? Chez moi ça s'arrête toujours après le masquage de l'extension, mais fonctionne jusqu'au bout lorsqu'il est appelé par le service...
    Si le script Change_nom fonctionne sur un service, et qu'il ne fonctionne pas sur l'action de dossier, c'est peut être du au mécanisme des actions de dossier.
    C'est un peu compliqué, mais voici une explication simplifiée: l'action de dossier "on adding items" est déclenchée dès l'ajout du premier fichier. Le script correspondant peut donc démarrer avec une liste de fichier dont le premier est présent dans le dossier et les suivants, pas encore (ou partiellement).
    Ce problème a été partiellement contourné par Apple avant 2013 par l'ajout d'une temporisation sur l'appel des scripts d'action de dossier.

    Pour ajouter quelques photos par copie de et vers le disque interne, le temps de copie est tel que l'action de dossier se déclenche maintenant seulement une fois que les fichiers sont vraiment présents dans ce dossier.
    Mais si la copie est plus longue (serveur lent, liaison lente, gros fichiers, mac lent) le problème persiste. J'avais donné une solution en 2013 dans l'article sur ce même site sur les actions de dossier (routine pour attendre la fin de copie).

    Avant de se lancer dans des choses compliquées, je te suggère de tester sur ta machine avec la modification ci-dessous :
    Dans le script FAS_Sous_dossiers.scpt :
    - juste avant l'appel à la routine Change_Nom, ajoute une instruction "delay 3" pour attendre 3 secondes. Ne me demande pas pourquoi 3 et pas 4, ...c'est juste une idée !

    Par ailleurs, dans la routine Change_Nom, tu dis qu'elle s'arrête après l'extension. Donc par rapport au script envoyé, dois je comprendre que tu vois "OK pour 1", puis "extension OK", mais pas "OK pour 2" ?

    Enfin, pour ce qui est des chocolats, c'est très gentil, mais j'en ai reçu suffisamment pour tenir au moins jusqu'en février !
    Cordialement

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    J'y avais pensé aussi après avoir lu un de tes messages à ce sujet, ajouter un délai (même de 60 sec) ne change rien... Pour les test je me contente de déplacer un fichier du dossier parent au sous-dossier donc sur le même disque, ça devrait se faire en une fraction de seconde...

    Par ailleurs, dans la routine Change_Nom, tu dis qu'elle s'arrête après l'extension. Donc par rapport au script envoyé, dois je comprendre que tu vois "OK pour 1", puis "extension OK", mais pas "OK pour 2" ?
    C'est ça, le troisième ne vient pas...

    J'ai déplacé le masquage de l'extension après la définition de ancienNomFichier comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    on Change_Nom(les_Fichiers) -- routine de changement de fichiers
     
    	repeat with un_Fichier in les_Fichiers
    		tell application "Finder" to display dialog "Ok pour 1"
     
                    -- determine nouveau nom
    		set ancienNomFichier to name of un_Fichier
    		tell application "Finder" to display dialog "Ok pour 2"
     
    		-- Masquage extension --
    		tell application "Finder"
    			set extension hidden of the un_Fichier to true
    			tell application "Finder" to display dialog "Extension Ok"
    		end tell
    L'extension n'est plus masquée (et la confirmation qui vient avec ne vient évidement pas).
    On dirait donc que c'est la définition de ancienNomFichier qui bloque... J'ai encadré dans le code ci-dessus la ligne " set ancienNomFichier to name of un_Fichier" par un try et end try et le masquage de l'extension fonctionne à nouveau, évidement ça continue à bloquer ensuite puisque la variable ne doit pas se définir correctement...

    Pour tester j'ai ensuite placé directement la fonction On Change Nom dans FAS_Sous-dossier.scpt en remplaçant l'existant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    on adding folder items to Mon_Dossier after receiving Liste_Fichiers
    	set Ma_Lib to (load script file "Users:Charles:Library:Scripts:Folder Action Scripts:Change_nom.scpt")
     
     
    	repeat with un_Fichier in Liste_Fichiers
    		tell application "Finder" to display dialog "Ok pour 1"
     
    		-- determine nouveau nom
     
    		set ancienNomFichier to name of un_Fichier
     
    		tell application "Finder" to display dialog "Ok pour 2"
     
    		-- Masquage extension --
    		tell application "Finder"
    			set extension hidden of the un_Fichier to true
    			tell application "Finder" to display dialog "Extension Ok"
    		end tell
    		-- Suppression éléments nom --
    		tell Ma_Lib to set NouveauNom to Remplace(ancienNomFichier, {".1024x768", ".1024x600", ".toto"}, "")
    		tell application "Finder" to display dialog "Ok pour 3"
    		-- Remplacement 1 --
    		tell Ma_Lib to set NouveauNom to Remplace(NouveauNom, {".V", ".Version ", ".V."}, "- V")
    		tell application "Finder" to display dialog "Ok pour 4"
    		-- Remplacement 2 --
    		tell Ma_Lib to set NouveauNom to Remplace(NouveauNom, {".A finir", ".Non achevé", ".Terminé"}, "- FINI")
    		tell application "Finder" to display dialog "Ok pour 5, nouveau nom=" & NouveauNom
     
    		tell application "System Events" to set name of un_Fichier to NouveauNom
     
    	end repeat
    	tell application "Finder" to display dialog "Ok pour 6"
    end adding folder items to
    En ne laissant que dans Change°nom.scpt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    on Remplace(Nom, Liste, Nouveau) -- remplace dans le Nom, les élements de la Liste par Nouveau
    	set {ancienTID, my text item delimiters} to {my text item delimiters, Liste}
    	set TempNom to text items of Nom
    	set my text item delimiters to Nouveau
    	set Nom to TempNom as text
    	set my text item delimiters to ancienTID
    	return Nom
    end Remplace
    J'ai toujours le "ok 1" mais pas le "Ok 2"... La variable AncienNomFichier ne veut toujours pas se définir correctement...

    Je me suis souvenu qu'à un moment avant d'utiliser deux routines distinctes ça fonctionnait via l'action de dossier (au moment où j'avais oublié de corriger deux variables), j'ai donc remis FAS_Sous_dossier.scpt dans son état original et remplacé Change_nom.scpt par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    on Change_Nom(les_Fichiers) -- routine de changement de fichiers
     
    	tell application "System Events"
    		repeat with un_Fichier in les_Fichiers
    			tell application "Finder" to display dialog "Ok pour 1"
     
    			-- Masquage extension --
    			tell application "Finder"
    				set extension hidden of the un_Fichier to true
    				tell application "Finder" to display dialog "Extension Ok"
    			end tell
     
     
    			-- determine nouveau nom
    			set ancienNomFichier to name of un_Fichier
    			tell application "Finder" to display dialog "Ok pour 2"
    			-- Suppression éléments nom --
    			set {ancienTID, my text item delimiters} to {my text item delimiters, {".1024x768", ".1024x600", ".toto"}}
    			set texteNomFichier to text items of ancienNomFichier
    			set my text item delimiters to ""
    			tell application "Finder" to display dialog "Ok pour 3"
    			set nouveauNomFichier to texteNomFichier as text
    			set my text item delimiters to ancienTID
    			set name of un_Fichier to nouveauNomFichier
    			tell application "Finder" to display dialog "Ok pour 4"
     
    			-- Remplacement 1 --
    			set {ancienTID2, my text item delimiters} to {my text item delimiters, {".V", ".Version ", ".V "}}
    			set texteNomFichier2 to text items of nouveauNomFichier
    			set my text item delimiters to "- V"
    			set nouveauNomFichier2 to texteNomFichier2 as text
    			set my text item delimiters to ancienTID2
    			set name of nouveauNomFichier to nouveauNomFichier2
     
    			-- Remplacement 2 --
    			set {ancienTID3, my text item delimiters} to {my text item delimiters, {".A finir", ".Non achevé", ".Terminé"}}
    			set texteNomFichier3 to text items of nouveauNomFichier2
    			set my text item delimiters to "- FINI"
    			set nouveauNomFichier3 to texteNomFichier3 as text
    			set my text item delimiters to ancienTID3
    			set name of nouveauNomFichier to nouveauNomFichier3
     
    		end repeat
    		tell application "Finder" to display dialog "Ok pour 6"
    	end tell
     
    end Change_Nom
    Et la, ca va jusqu'au bout...
    Dans un cas "set ancienNomFichier to name of un_Fichier" bloque, dans l'autre non...

    J'ai faillit craquer et envoyer mon message tel quel, un peu rempli de désespoir, en constatant que la seule différence en plus de la routine remplace était un "tell application "System Events"" avant "repeat with un_Fichier in les_Fichiers" et qu'après l'avoir rajouté dans le dernier ça ne changeait rien...
    Finalement en remplaçant la ligne qui ne fonctionnait pas par "tell application "System Events" to set ancienNomFichier to name of un_Fichier" ça à l'air de fonctionner...

    Je n'ai plus le temps de confirmer ça par davantage de tests mais il semblerait que je puisse venir demain me contenter de te souhaiter une bonne année et de cliquer sur "Résolu"...
    Je croise les doigts, en attendant, je te souhaite un bon réveillon...

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Alors finalement j'ai du remplacer le "System events" par "Finder" sinon ca ne marchait que pour l'action de dossier et pas le service (ou l'inverse je ne me souvient plus) mais à present tout fonctionne... Alors je te dis une fois de plus un grand Merci !

    Toutefois, je ne vais pas cliquer sur Résolu et t'embêter encore un peu si tu veux bien...
    Comme j'ai trouvé ca relativement plaisant de voir les choses se faire toutes seules une tasse de café à la main ou pendant que je change une couche, j'ai poursuivi l'automatisation des taches concernant l'archivage postérieur des fichiers...

    J’ai plusieurs scripts et plusieurs question dessus… Je vais essayer d'être exhaustif dès le début cette fois-ci... ^^

    Script n°1 (Change_nom.scpt) : Change le nom des fichiers reçus par action de dossier ou service Finder.
    Script n°2 (Dispatch.scpt) : Dispatche pour Archivage les fichiers reçus dans des dossiers en fonction du nom des fichiers en question… Avec deux routines de déplacement. La première est appelée pour déplacer sur un disque externe (USB ou réseau suivant le fichier en question) s’il est connecté, ou pour déplacer dans un dossier « Archives » sur le disque interne si le disque de destination finale n’est pas connecté. La deuxième se contente de déplacer définitivement les fichiers du dossier « Archives » du disque interne sur le disque lorsqu’il est connecté.

    La deuxième routine du 2e script est appelée par un script-application.

    La première routine du 2e script est appelé soit :
    • par une action de dossier attachée à un Dossier disons « Dossier 1 ». Il reçoit seulement des fichiers. Les fichiers arrivent et déclenchent directement le script 1 (au cas où le nom n’a pas déjà été filtré) et le script 2 de déplacement.
    • par une action de dossier (Script n°3) attachée à un Dossier disons « Dossier 2 ». Il reçoit soit des fichiers seuls, soit des fichiers contenus dans un certain nombre de sous-dossiers, parfois 1, parfois 2, parfois… Il déclenche donc après filtrage les script 1 et 2 sur les fichiers.

    S’ajoute donc :
    Script n°3 (en grande partie inspiré du tiens ici) : Il charge en boucle chaque sous-dossiers contenus dans le « Dossier 2 » et filtre uniquement les fichiers vidéos avant de les renvoyer un par un vers les script 1 et 2 qui changent les noms et déplace vers le dossier archive adéquat. Enfin il fini par supprimer les sous-dossiers (et leur contenu qui ne sont pas des vidéos) du "Dossier 2".

    Tout marche plutôt bien à l’exception d’une ou deux choses qui appellent des questions…

    1/ La premiere… Lorsque le script 2 reçoit un fichier relativement volumineux et qu’il doit le déplacer sur le disque réseau (au mieux connecté en Ethernet, au pire en wifi), évidemment ça prend un certain temps, surtout en wifi… Avant la fin de ce temps certain j’obtiens une erreur… Je n’ai pas le script sous la main là tout de suite pour la reproduire et la retranscrire avec exactitude mais c’est quelque chose comme « Apple Event, délais dépassé… » et le script s’arrête. Le déplacement prend visiblement trop de temps, le script perd patience et s’arrête. Le déplacement du fichier en question continue mais il n’est pas supprimé du disque interne et les fichiers suivants ne sont pas traités…
    J’ai bien essayé après la commande « move » de mettre un delay en fonction de la taille du fichier mais visiblement tant que la commande move n’est pas achevée, le script est suspendu et donc le delay n’est pas pris en compte et du coup j’ai toujours l’erreur délai dépassé…

    2/ Les scripts 1 et 2 étant appelés à traiter des fichiers par lot lorsqu’ils sont appelés par les actions de dossiers ils comportent un « repeat with Le_Fichier in Les_Fichiers ».
    Lorsqu’ils sont appelés par le script 3 qui donc n’envoit qu’un fichier par un fichier ça plante. Si j’enlève les repeats dans les scripts 1 et 2 ca marche, si je lance le script 3 dans l’éditeur de script ca marche, mais si c’est l’action de dossier du script 3 ça plante…
    Etant précisé que le script contient le chemin du dossier 2 en dur et que l’action de dossier n’est là que pour detecter la création d’un fichier dans ce dossier et déclencher les scripts…

    Mes questions de façon plus claires et concises donc…
    1/ Existe t’il un moyen de forcer le script 2 a avoir de la patience lorsque le déplacement du fichier prend du temps ?
    2/ Subsidiairement pourquoi cela fonctionne dans l’éditeur mais pas dans l’action dossier elle-même ? Mais surtout comment contourner le problème sans dédoubler les scripts 1 et 2 avec une version contenant le repeat et l’autre non ?

    Je fois de plus, je vais te remercier pour l'aide que tu pourra m'apporter... ^^

  16. #16
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Citation Envoyé par Ckarsenti Voir le message
    1/ Existe t’il un moyen de forcer le script 2 a avoir de la patience lorsque le déplacement du fichier prend du temps ?
    2/ Subsidiairement pourquoi cela fonctionne dans l’éditeur mais pas dans l’action dossier elle-même ? Mais surtout comment contourner le problème sans dédoubler les scripts 1 et 2 avec une version contenant le repeat et l’autre non ?
    A mon humble avis, tu as 2 façons possibles pour résoudre ces problèmes :
    L'instruction "with timeout of xx second" : Applescript va augmenter sa "patience" (par défaut environ 2 minutes), au nombre de secondes indiqué.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with timeout of 600 seconds-- faire quelque chose
    end timeout
    Ce script te permet d'exécuter les instructions "faire quelque chose" sans que Applescript ne génère d'erreur avant 10 minutes (600 secondes).
    Si le programe dure moins de 600 secondes, le script n'attendra bien sûr pas ces 600 secondes !

    La seconde méthode est de faire travailler Applescript (pour qu'il ne s'impatiente pas !) pendant l'opération de copie.
    Pour cela, tu peux faire une boucle sur la taille du fichier copié jusqu'à ce que cette taille ne change plus pendant 1 seconde environ. On peut alors considérer que si aucun octet n'est ajouté au fichier copié pendant une seconde, c'est que la copie est finie !
    J'ai mis ce type de script dans mon article sur les actions de dossier (justement pour attendre la fin de la copie !)


    Pourquoi cela fonctionne dans un script direct et pas dans l'action de dossier ? Il y a en générale 2 raisons :
    1) le contexte d'exécution n'est pas le même : dans l'éditeur de script, c'est ton script qui est au premier plan et mais pas dans l'action de dossier.
    2) les temps sont différents (pas le même timeout, pas les mêmes priorités de process allouées par l'OS,...)

    Enfin, en général, si tu veux avoir une fonction exécutée sans repeat et la même avec repeat, cela sent fortement la sub-routine (comme Change_Nom !)
    Tu fais ta routine pour un seul, en passant le paramètre adéquat.
    Ensuite, soit tu appelles cette routine avec une fois le paramètre, soit tu fais une boucle qui appelle cette même routine à chaque itération avec un paramètre qui vient de cette boucle.

    Cordialement

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    A mon humble avis, tu as 2 façons possibles pour résoudre ces problèmes :
    L'instruction "with timeout of xx second" : Applescript va augmenter sa "patience" (par défaut environ 2 minutes), au nombre de secondes indiqué.
    Ce script te permet d'exécuter les instructions "faire quelque chose" sans que Applescript ne génère d'erreur avant 10 minutes (600 secondes).
    Si le programe dure moins de 600 secondes, le script n'attendra bien sûr pas ces 600 secondes !

    La seconde méthode est de faire travailler Applescript (pour qu'il ne s'impatiente pas !) pendant l'opération de copie.
    Pour cela, tu peux faire une boucle sur la taille du fichier copié jusqu'à ce que cette taille ne change plus pendant 1 seconde environ. On peut alors considérer que si aucun octet n'est ajouté au fichier copié pendant une seconde, c'est que la copie est finie !
    J'ai mis ce type de script dans mon article sur les actions de dossier (justement pour attendre la fin de la copie !)
    J'ai testé les deux possibilités, et la deuxième à l'air plus séduisante mais j'ai l'impression que seule la première méthode peut fonctionner... La partie du code concernée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    set Dossier_Version_existe to Test_Existe(Dossier_Projet, N_Version)
    	if Dossier_Version_existe is not "ok" then
    		my Creation_dossier(Dossier_Projet, N_Version)
    		set Dossier_Version_existe to Test_Existe(Dossier_Projet, N_Version)
    	end if
    	if Dossier_Version_existe is "ok" then
    		tell application "Finder" to set taille to size of Le_fichier_a_dispatcher
    		with timeout of 600 seconds
    			tell application "Finder" to move Le_fichier_a_dispatcher to folder N_Version of Dossier_Projet
    		end timeout
     
    		-- Verification transfert & Suppression --
    		tell application "Finder" to set taille_nouv to size of the file named Nom_Fichier in folder N_Version of Dossier_Projet
    		if taille_nouv is equal to taille then			
    			if Disque_destination does not contain "Disque Interne" then
    				tell application "Finder" to delete Le_fichier_a_dispatcher
    			end if
    		end if
    	end if
    end Dispatch
    Dis moi si je me trompe mais dans ton exemple sur le dossier téléchargement, l'écriture du fichier est gérée a priori par Safari ou autre, dans mon cas le fichier est déplacé par le script lui-même et ensuite supprimé par le script... Comme avec ma tentative de Delay, j'ai l'impression que la vérification en boucle de la taille placée après la commande move n'est déclenchée que si cette dernière réussie et donc ne fonctionne pas...
    Si c'est bien ça le problème est-ce que je peux mettre un timeout "exorbitant" de deux ou trois heures ? Là ca fonctionne avec deux fichiers de 500Mo à la suite mais si jamais se sont des fichiers de 2Go ou que le disque est pris de flemme (hier un fichier de 50 Mo à mit 5 fois plus de temps que les deux de 500 d'aujourd'hui sans que je ne sache vraiment pourquoi...) le temps peut-être beaucoup plus long....


    Pourquoi cela fonctionne dans un script direct et pas dans l'action de dossier ? Il y a en générale 2 raisons :
    1) le contexte d'exécution n'est pas le même : dans l'éditeur de script, c'est ton script qui est au premier plan et mais pas dans l'action de dossier.
    2) les temps sont différents (pas le même timeout, pas les mêmes priorités de process allouées par l'OS,...)
    Ce qui m'a perturbé c'etait que quand le service Finder ne traite qu'un fichier le repeat passe quand même sans problème même s'il n'y a qu'un Le_Fichier in Les_Fichiers mais quand c'est un script qui n'envoie qu'un fichier ca ne passe pas... Sans doute une combinaison des deux raisons... ^^

    Enfin, en général, si tu veux avoir une fonction exécutée sans repeat et la même avec repeat, cela sent fortement la sub-routine (comme Change_Nom !)
    Oui j'avoue avoir découvert la magie des routines grâce à toi et les avoirs utilisé un peu à tout bout de champs depuis pour écrire les autres scripts, ça simplifie les scripts, les rends plus clairs et plus modulables je trouve... ^^

    Tu fais ta routine pour un seul, en passant le paramètre adéquat.
    Ensuite, soit tu appelles cette routine avec une fois le paramètre, soit tu fais une boucle qui appelle cette même routine à chaque itération avec un paramètre qui vient de cette boucle.
    En gros, si j'ai bien compris, au lieu d'avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my routine(Les_Fichiers)
     
    on routine(Les_Fichiers)
    	repeat with Le_fichier in Les_Fichiers
    		---
    	end repeat 
    end routine
    Je remplace par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    repeat with Le_fichier in Les_Fichiers
    	my routine(Le_Fichier)
    end repeat 
     
    on routine(Le_Fichier)	
    	---
    end routine
    J'avais pensé à faire quelque chose comme ça à un moment mais comme ça nécessitait de modifier tous les appels de routine concernés, je me demandais s'il y avait un moyen de convaincre le script de passer outre l'anomalie, mais sans doute qu'à vouloir toujours chercher une meilleure solution on passe à coté des plus simples... :p

  18. #18
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Je n'ai jamais essayer un timeout de 3 heures (10800 secondes), aussi je ne peux te répondre. A toi de tester.

    Pour ce qui est de l'exemple, il suffit que tu écrives une sous-routine qui boucle sur la taille du fichier de destination (la version copiée). ainsi, quand sa taille ne change plus pendant 1 ou 2 secondes, cela signifie que la copie est faite.

    Il est aussi possible d'utiliser une syntaxe de type "ignoring application responses". Cela fait quelques années que je ne l'utilise plus, mais tu peux essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tell application "Finder"    
    ignoring application responses
    move A to B
        end ignoring
    end tell
    Si je me souviens bien, l'inconvénient est que tu ne reçois plus de résultat ou d'erreur (disk full, write error,...).

    Pour copier un fichier, tu peux aussi utiliser une commande do shell script "cp", en envoyant le résultat vers /dev/null. ainsi la commande est exécuter sans attendre la fin et rend la main immédiatement au script. Bien sûr, cela rend obligatoire la boucle sur la taille du fichier copié.


    Quant aux appels aux sous-routines, c'est effectivement très puissant, mais il faut faire attention à quelques astuces/contraintes:

    Une sous-routine peut en appeler une autre qui elle même en appelle une autre. Cela rend chaque routine plus lisible et facile à maintenir.

    il faut éviter d'appeler une sous-routine au milieu d'un bloc "tell/end tell". Surtout si elle-même contient des blocs "tell/end tell".
    En effet cela génère des erreurs parfois assez difficilement détectables.
    Je m'applique une règle simple : avant d'appeler une sous-routine, je m'arrange pour ne pas être dans un bloc tell, sauf ci cette sous-routine est très simple (formatage de date,...). moyennant quoi, tout fonctionne !

    il faut bien faire attention aux paramètres d'une sous-routine, ainsi qu'aux variables locales /globales.
    Par habitude (mais ce n'est pas une obligation), mes sous-routines n'utilisent en général que des variables locales (temporaires, le temps de la sous-routines) et les variables passées en paramètre. AppleScript est assez flexible pour les paramètres qui peuvent être des variables simples, des listes, des records, des liste de listes, des records de records, etc... bien plus qu'il n'en faut !

    Saches enfin qu'il existe aussi des sous-routines récursives. Dans ce cas la routine peut appeler, au milieu de ses instructions, une instruction égale à l'appel de cette même sous-routine !!
    Par exemple un programme traite un dossier en faisant appel à une sous-routine.
    Celle-ci traite les fichiers de ce dossier avec le traitement N°1. Si l'un des ces éléments est un dossier cette routine s'appelle elle-même avec comme paramètre ce dossier.
    Ainsi, tout les sous-dossier de sous-dossier de sous dossier (quelque soit le nombre de niveaux) seront traités ! Elle est pas belle la vie ?


    Cordialement

  19. #19
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    En complément, j'ai préparé un petit test combinant le Ignoring et une sous-routine de boucle avec test de taille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    set A to POSIX file "/Users/imac27/Desktop/exemples/video.mp4"
    set B to POSIX file "/Users/imac27/Desktop/Test2"
    tell application "Finder"
        ignoring application responses
    duplicate A to B
        end ignoring
        display dialog "Copie lancée"
    end tell
    if CopieTerminee(A, B) then display dialog "copie terminée"
    
    
    
    
    on CopieTerminee(Source, Destination) -- retourne "true" quand la copie du fichier Source vers le directory Destination est terminée
        set Lsize to -1
        tell application "Finder" to set Nom_Source to name of file Source
        set FichierCopie to (Destination as string) & ":" & Nom_Source
    delay 1
        set X to 0
        repeat until Lsize = X
            set Lsize to X
            tell application "Finder" to set X to physical size of file FichierCopie
    delay 2
        end repeat
        return true
    end CopieTerminee
    Le code ci-dessus lance un "duplicate" de 2 fichiers (à toi de modifier les lignes 1 et 2 pour un exemple sur ton mac). J'ai choisi un "duplicate" au lieu d'un "move" pour avoir un temps de copie (le fichier video.mp4 pèse près de 3Go !).

    Le premier dialog "Copie lancé" s'affiche une seconde après le début du script et reste affiché jusqu'à ce que tu cliques OK. en tâche de fond, et non synchronisé, tu verras apparaître la fenêtre Finder de progression de la copie. Tu peux cliquer "OK" et attendre la copie complète.
    Le second dialog "copie terminée", ne s'affichera qu'environ 1 ou 2 secondes après la fin de la copie effective.
    A partir de là, tu peux continuer ton script !

    Cordialement

Discussions similaires

  1. Exécution automatique d'une action
    Par mon_pseudo dans le forum Struts 1
    Réponses: 2
    Dernier message: 28/07/2009, 22h23
  2. execution automatique d'une action par le serveur
    Par mael94420 dans le forum ASP
    Réponses: 3
    Dernier message: 16/06/2006, 11h18
  3. declenchement automatique d'une action
    Par WELCOMSMAIL dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/04/2006, 17h40
  4. declenchement automatique d'une action
    Par WELCOMSMAIL dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 14/04/2006, 16h56
  5. declenchement automatique d'une action
    Par WELCOMSMAIL dans le forum Oracle
    Réponses: 12
    Dernier message: 13/04/2006, 21h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo