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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du 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
    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 émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    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
    Membre du 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
    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 émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    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
    Membre du 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
    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
    Membre du 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
    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 émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    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
    Membre du 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
    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 émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    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
    Membre du 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
    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 émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    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 : 606
    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

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, 23h23
  2. execution automatique d'une action par le serveur
    Par mael94420 dans le forum ASP
    Réponses: 3
    Dernier message: 16/06/2006, 12h18
  3. declenchement automatique d'une action
    Par WELCOMSMAIL dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/04/2006, 18h40
  4. declenchement automatique d'une action
    Par WELCOMSMAIL dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 14/04/2006, 17h56
  5. declenchement automatique d'une action
    Par WELCOMSMAIL dans le forum Oracle
    Réponses: 12
    Dernier message: 13/04/2006, 22h17

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