# Automatiser un script Automator, Un script qui agit individuellement sur plusieurs dossiers



## Kontarkos (12 Juin 2020)

Bonjour à tous,
Voici une marotte des dossiers des forums : automatiser la conversion d'images JPG en PDF…
OK j'ai écris un script pour cela dans Automator dont je vous livre la prévue :






Bref détail du script : on clique sur un dossier et le script créé un pdf avec le contenu du dossier. Il renomme ce pdf du nom du dossier et place à la corbeille ce dernier.
Jusqu'à là ça marche très bien.

Je cherche un moyen de faire cela pour plusieurs dossier en même temps. Le script doit agir individuellement sur chaque dossier.
Si je lance une action de dossier, Automator prend le contenu de tous les dossier pour créé qu'un seul pdf ; ce que je veux pas.

La solution n'est pas dans Automator visiblement.

Une solution ?                

Merci pour m'avoir lu jusqu'ici…


----------



## zeltron54 (12 Juin 2020)

Bonsoir,

Il te faut un petit applescript qui se servira d'une application automator.

Pour automator 3 actions





bien renseigner
"enregistrer la sortie dans:" Bureau
"nom du fichier de sortie:" ok
Enregistrer comme application (pour faciliter le script je l'a met sur le bureau avec le nom "JpgVersPdf". Ce nom sera utilisé par le script.

Pour le script (applescript) a son lancement:
Le script te demande de choisir:
1 - le dossier original contenant les images ainsi que tous les dossiers contenant les images.
2 - le dossier de destination pour recevoir les pdf.

Il traite tous les dossiers et sous dossiers trouvés dans le dossier original choisi.

Il te met un message lorsqu'il a terminé. c'est assez long car il faut un délai de 5 secondes entre chaque dossier (temps d'enregistrement)

Il ne te reste plus que, après vérification, à supprimer le dossier original.


```
-- regroupe les images du dossier dans un PDF

tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les dossiers avec JPG"
    set destination to choose folder with prompt "Sélectionnez le dossier destination"
    
    my inspecter(chemin, destination) --appel routine avec transmission des variables
end tell

on inspecter(un_dossier, destination)
    set bureau to (path to desktop folder) as string
    -- récupération du nom du dossier
    set ledossier to un_dossier as string
    set ledossier to text 1 thru -2 of ledossier
    set AppleScript's text item delimiters to {":"}
    set ddd to get last text item of ledossier
    
    tell application "Finder"
        set ledossier to ledossier as alias
        select ledossier
    end tell
    
    set monappli to bureau & "JpgVersPdf.app:Contents:MacOS:Application Stub"
    tell application monappli to launch
    
    delay 5
    
    tell application "Finder"
        
        set nom to bureau & "ok.pdf" as alias
        move nom to destination
        set destination to destination as string
        
        set nom to destination & "ok.pdf" as alias
        set nouveaunom to ddd & ".pdf" --le nouveau nom = nom du dossier
        
        set name of nom to nouveaunom --renomme le fichier
        
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier, destination)
        end repeat
    end tell
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## Kontarkos (13 Juin 2020)

Mille mercis Zeltron, grand maître des scripts !
Bon je viens d'essayer ta solution. A priori j'y vois quelques problèmes.
Je te fais un topo complet dès que possible.
Merci et bonne journée


----------



## Kontarkos (15 Juin 2020)

Hello Zeltron,
Merci pour ta réponse. Voila ce que je relève de ton script.
Premièrement j'ai rajouté dans ton script Automator un classement des fichiers par nom. Sinon on se retrouve avec des pages dans un ordre plutôt aléatoire dans les pdf.
Ensuite le script fait bien des pdf de *tous* les dossiers, y compris les dossiers racines… ce qui serait à éviter.




Le dossier parent de cet exemple s'appelle "Essai de dossier à traiter". Donc 2 pdf en trop : "Dossier à vérifier.pdf" et "Essai de dossier à traiter.pdf". Ces pdf affichent des pages vierges.

Maintenant, l'ergonomie…
Le script Automator que j'ai écrit me convient bien car il n'y a pas de demande utilisateur. Je sélectionne un dossier, j'appuie sur une touche…et le travail est fait ! Sans consulter l'utilisateur. Dans ton script, il faut désignier le dossier source. Vu la somme de dossiers, et sous dossiers à traiter, cela n'est pas faisable. Surtout que je souhaite que les pdf se créés dans chaque dossier source et non pas dans un seul endroit définit.
Mon script Automator ici.
Il doit être possible de faire un script qui à partir de la sélection sur le Finder, comprend la sélection et traite les sous dossiers sans rien demander à l'utilisateur.
Est-ce possible ?
Je ne connais pas trop Applescript, mais je vais apprendre à partir de ton script.
Mille mercis…


----------



## zeltron54 (15 Juin 2020)

Bonjour,
Si j'ai bien compris, tu veux juste un script qui boucle sur tous les dossiers inclus dans ton dossier sélectionné, et qui pour chaque dossier appelle ton appli automator.

Alors, je te mets un script qui fait ça.
il faut au préalable que tu enregistres tes actions automator comme application, Puis tu vérifies le nom de de cette appli avec un clic droit, afficher le contenu du paquet, contents, macOs,    tu récupères le nom et tu renseignes le chemin complet dans le script. Ou il est actuellement:   set monappli to bureau & "JpgVersPdf.app:Contents:MacOS:Application Stub"

Au lancement du script avec un dossier sélectionné, le script appelle ton appli automator pour chaque dossier non vide contenu dedans.
J'espère avoir bien compris  ce que tu veux ! tiens moi au courant.


```
-- regroupe les images du dossier dans un PDF

tell application "Finder"
    set chemin to selection
   
    my inspecter(chemin) --appel routine avec transmission des variables
end tell

on inspecter(un_dossier)
    set bureau to (path to desktop folder) as string
    tell application "Finder"
        set ledossier to un_dossier as alias
        select ledossier
        set lesfichiers to files of ledossier as list
        set nbf to count lesfichiers
        display dialog nbf
    end tell
   
    if nbf > 0 then
       
       
        set monappli to bureau & "JpgVersPdf.app:Contents:MacOS:Application Stub"
        tell application monappli to launch
       
       
       
    end if
    tell application "Finder"
        -- traitement des dossiers :
        set un_dossier to un_dossier as alias
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## Kontarkos (15 Juin 2020)

Oui merci tu as bien compris mon problème. Il me manquait la procedure pour appeller cette boucle. 
Je vois cela ce soir et te tiens au courant 
Merci encore


----------



## zeltron54 (15 Juin 2020)

J'avais oublié d'effacer les dialogues de mes tests.
je le remet ci-dessous. Penser à  bien le chemin de l'appli automator.


```
-- regroupe les images du dossier dans un PDF

tell application "Finder"
    set chemin to selection
  
    my inspecter(chemin) --appel routine avec transmission des variables
end tell

on inspecter(un_dossier)
    set bureau to (path to desktop folder) as string
    tell application "Finder"
        set ledossier to un_dossier as alias
        select ledossier
        set lesfichiers to files of ledossier as list
        set nbf to count lesfichiers
    end tell
  
    if nbf > 0 then
      
        --appelle l appli automator renseigner l'adresse ci-dessous
        set monappli to bureau & "JpgVersPdf.app:Contents:MacOS:Application Stub"
        tell application monappli to launch
    end if

    tell application "Finder"
        -- traitement des dossiers :
        set un_dossier to un_dossier as alias
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## Kontarkos (16 Juin 2020)

Le script ne marche pas du tout ! 
J'ai refait mon application avec un ordre simple, histoire de tester (mettre un élément sélectionné en rouge) et résultat peu probant.
Grâce à Applescript, je vais pouvoir aller au pas à pas pour voir ce qui ne va pas.
Il est trop tard ce soir, je remet ça demain soir…
Dodo pour l'instant


----------



## zeltron54 (16 Juin 2020)

Bonjour,
pour t'aider à tester, je te mets le script, qui au lieu d'appeler l'appli automator , mets un dialogue te disant " j'appelle  automator avec le dossier (nom du dossier) sélectionné".

Si ce script fonctionne il te faudra alors bien vérifier le chemin pour l'appel de tes actions automator, qui je le rappelle doit être enregistré comme application, ce chemin doit être le contenu du dossier  MacOS (normalement Application Stub) dans contents dans ton appli.

Bon tests !


```
-- regroupe les images du dossier dans un PDF

tell application "Finder"
    set chemin to selection
   
    my inspecter(chemin) --appel routine avec transmission des variables
end tell

on inspecter(un_dossier)
    set bureau to (path to desktop folder) as string
    tell application "Finder"
        set ledossier to un_dossier as alias
        select ledossier
        set lesfichiers to files of ledossier as list
        set nbf to count lesfichiers
    end tell
   
    if nbf > 0 then
        tell application "Finder"
            display dialog "j'appelle  automator avec le dossier : " & ledossier & " sélectionné"
        end tell
        --appelle l appli automator renseigner l'adresse ci-dessous
        --set monappli to bureau & "JpgVersPdf.app:Contents:MacOS:Application Stub"
        --tell application monappli to launch
    end if
   
    tell application "Finder"
        -- traitement des dossiers :
        set un_dossier to un_dossier as alias
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## Kontarkos (16 Juin 2020)

Ce script marche bien. J'ai bien fait attention au chemin de l'appli Automator comme tu me l'as indiqué.
C'est donc à l'intérieur de mon appli Automator que ça ne va pas.
Je cherche ce soir et je te dis quoi.
Merci pour ton aide


----------



## Kontarkos (16 Juin 2020)

C'est à ne rien comprendre !
J'ai écris un script tout simple pour changer la couleur d'un élément. Voici ce script que j'ai enregistré sur le bureau, avec le nom "JpgVersPdf.app" en verifiant bien dans le paquet le nom "Application Stub".




Si je glisse un élément du finder sur cette application, le tag devient bien vert. Donc ça marche.
J'exécute ton script. J'ai bien le détail de chaque sous dossier, mais aucun des éléments ne devient vert !
Alors où ça coince ?
Au premier lancement de l'appli Automator, le finder me demande d'accepter les autorisations pour ce fichier, ce que je fais.
Mystère total…


----------



## zeltron54 (16 Juin 2020)

Le script est plus rapide que l'exécution d'automator donc il sélectionne le dossier suivant avant d'avoir exécuté les actions.

If faut ajouté un délai de 1 ou plusieurs secondes.
sur le script ci-dessous j'ai ajouté 1 seconde.


```
-- regroupe les images du dossier dans un PDF

tell application "Finder"
    set chemin to selection
 
    my inspecter(chemin) --appel routine avec transmission des variables
end tell

on inspecter(un_dossier)
    set bureau to (path to desktop folder) as string
    tell application "Finder"
        set ledossier to un_dossier as alias
        select ledossier
        set lesfichiers to files of ledossier as list
        set nbf to count lesfichiers
    end tell
 
    if nbf > 0 then
      
        --appelle l appli automator renseigner l'adresse ci-dessous
        set monappli to bureau & "JpgVersPdf.app:Contents:MacOS:Application Stub"
        tell application monappli to launch
delay 1
    end if

    tell application "Finder"
        -- traitement des dossiers :
        set un_dossier to un_dossier as alias
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## Kontarkos (16 Juin 2020)

OK j'essaye ce soir


----------



## Kontarkos (16 Juin 2020)

OK j'essaye ce soir


----------



## Kontarkos (18 Juin 2020)

Test en cours. Je dois ré adapter mon script automator, car cela ne marche pas. 
Je suis trop éloigné de mon Mac pour l'instant. A lundi pour la suite...


----------



## zeltron54 (18 Juin 2020)

Bonjour,
Je ne comprend pas trop, tu disais dans ton premier post que ton script Automator fonctionnait bien, là, le script ne fait que lancer ton automator à chaque dossier, donc à part l’histoire du délai à adapter, je ne vois pas le problème ...
Bref, en attente d’avoir des nouvelles...


----------



## Kontarkos (19 Juin 2020)

Oui tout à fait je ne comprends pas non plus. Je vais reprendre ton script qui demande pour chaque dossier une confirmation. Mon script marche bien sur 1 dossier sélectionné. Alors peut être que dans le script final le fonder ne comprend le dossier à faire mais ne le sélectionne pas... Je simple hypothèse. 
De toute manière, je ne peux plus tester pour l'instant car suis en déplacement sans Mac !


----------



## zeltron54 (19 Juin 2020)

Essai d’augmenter le délai à plusieurs secondes ( 5 ou même 10 ) qu´ Il soit supérieur au temps que met ton script Automator pour traiter un dossier. Je ne vois que ça comme problème.


----------



## zeltron54 (20 Juin 2020)

Bonjour,

Ton script pose problème, en effet la suppression du dossier origine après avoir traité un de ses dossiers, perturbe la boucle puisque l'on change le contenu du dossier pendant qu'elle s'exécute, elle à du mal à retrouver les éléments de sa liste.

J'ai donc écrit une autre script qui fait le job. Il crée un dossier provisoire dans lequel il met les fichiers pdf obtenus, puis à la fin supprime le dossier origine et renomme le dossier provisoire du nom du fichier origine.

Pour installer ce script, il faut le mettre dans le dossier scripts de ta bibliothèque.
chemin: macintosh HD:utilisateurs:ta petite maison:bibliothèque:Scripts
Si le dossier Scripts n'existe pas il faut le créer.

Il faut ensuite ouvrir l'application "Editeur de script" et dans les préférences de l'application, il faut cocher:
Menu des scripts: Afficher le menu des scripts dans le barre de menus et afficher les scripts de l'ordinateur.


Il suffira alors, pour traiter un dossier avec ses sous dossiers, de le sélectionner puis dans la barre de menu en haut à droite de choisir le script "jpg vers pdf" et d'attendre le message de fin.

Le script :  ici

en espérant que cela te convienne.


----------



## Kontarkos (20 Juin 2020)

OK merci bien. Étant actuellement en déplacement, je n'ai plus accès à un Mac. Je devrais trouver cela dès que je serais dans des contrées "civilisées". 
Merci pour ton aide


----------



## Kontarkos (20 Juin 2020)

OK merci bien. Étant actuellement en déplacement, je n'ai plus accès à un Mac. Je devrais trouver cela dès que je serais dans des contrées "civilisées". 
Merci pour ton aide


----------



## zeltron54 (21 Juin 2020)

Bonjour,
J'y pense, si tu préfères lancer le programme à partir d'un clic droit sur le dossier à traiter il te faut:

1 - Choisir un endroit de ton choix ou copier le script
2 - programmer un petit automator: une action rapide avec dans la 1ere action qui est proposée au départ: "le processus reçoit l'élément actuel: dossier" , tu ajoutes une action: "lancer l'application, pour laquelle tu choisis le script"
3 - tu enregistres ce processus automator sous (le nom de ton choix)

Tu pourras alors lancer le script depuis un clic droit sur le dossier à traiter.


Tiens moi au courant.


----------



## zeltron54 (28 Juin 2020)

@*Kontarkos*
 Alors tu as réussi à installer, ça fonctionne comme tu veux ?


----------



## Kontarkos (6 Juillet 2020)

Hello Zeltron.
Enfin de retour et j'ai pu observer ton script. Ça marche très bien.
Merci beaucoup.


----------



## zeltron54 (6 Juillet 2020)

Content pour toi !


----------

