2 votes

Automator: Applescript pour exécuter des frappes de clavier pour chaque dossier imbriqué dans le Finder

Aidez-moi !!

J'ai passé de nombreuses heures à essayer de résoudre ce problème et je pense qu'il est temps d'obtenir de l'aide :)

Je suis en train d'écrire un script Applescript dans Automator qui exécutera certaines frappes de touches dans Finder pour le dossier parent et chaque sous-dossier. Jusqu'à présent, je ne parviens qu'à appliquer les frappes de touches au dossier parent sélectionné lors de l'exécution du script ; les sous-dossiers restent tels quels sans avoir été affectés par les frappes de touches.

Les frappes de touches sont spécifiques à Finder et permettent de trier le dossier par "Type" et par "Nom".

Voici mon code :

activate application "Finder"

tell application "Finder"
    set theFolders to every folder of (choose folder) as alias list
end tell

tell application "System Events"
    repeat with eachFolder in theFolders
        keystroke "2" using {control down, command down}
        keystroke "1" using {control down, option down, command down}
    end repeat
end tell

Le code a du sens pour moi dans ma connaissance limitée de l'Applescript, mais évidemment il ne fonctionne pas correctement.

Des conseils ?

0voto

user3439894 Points 52496

Si j'ai bien compris ce que vous voulez, c'est-à-dire sélectionner un dossier, puis lui et tous les sous-dossiers qu'il contient, y compris les sous-dossiers des sous-dossiers, etc., obtiennent ces paramètres.

Pour envoyer les frappes de clavier aux dossiers cibles, chacun doit être la fenêtre active dans Finder d'abord, puis System Events peut envoyer les frappes de clavier.

Donc, je rédigerai le code comme dans l'exemple ci-dessous.

tell application "Finder"
    activate
    set parentFolder to (choose folder) as alias
    set theFolders to every folder of entire contents of parentFolder as alias list
    set theFolders to {parentFolder} & theFolders    -- # Ajoute le dossier choisi à la liste des dossiers à traiter.
    repeat with eachFolder in theFolders
        open eachFolder
        delay 0.5
        activate eachFolder    -- # Cela est fait pour s'assurer que la fenêtre du dossier cible est focalisée avant d'être traitée.
        tell application "System Events"
            keystroke "2" using {control down, command down}    -- # Définit : Affichage > Agencer par > Genre
            keystroke "1" using {control down, option down, command down}    -- # Définit : Affichage > Trier par > Nom
        end tell
        close eachFolder
    end repeat
end tell

Si vous voulez agir uniquement sur les sous-dossiers de premier niveau dans le dossier parent, alors au lieu de :

set theFolders to every folder of entire contents of parentFolder as alias list

Utilisez ce qui suit :

set theFolders to every folder of parentFolder as alias list    

Remarquez que le delay 0.5 peut ne pas être absolument nécessaire, cependant je l'ai ajouté car sans cela, la série d'ouverture et de fermeture des fenêtres de dossiers peut se produire si rapidement que c'en est perturbant, et ralentir un peu cela atténue cette sensation. Bien que cela puisse également être nécessaire, selon la vitesse à laquelle le traitement a lieu, pour s'assurer que la fenêtre de chaque dossier dans la repeat boucle est effectivement disponible et focalisée afin de recevoir les frappes de clavier. Dans tous les cas, la valeur de delay peut être modifiée selon les besoins pour permettre aux tâches de se produire correctement et de manière visuelle, apparaissant de manière plus naturelle qu'une avalanche d'ouverture/fermeture de fenêtres laissant un sentiment de confusion quant à ce qui vient de se passer.

0voto

mvern Points 23

@user3439894 mérite le crédit d'avoir répondu à cela.

Le code proposé par user3439894 était:

tell application "Finder"
activate
set parentFolder to (choose folder) as alias
set theFolders to every folder of entire contents of parentFolder as alias
set theFolders to {parentFolder} & theFolders    
repeat with eachFolder in theFolders
    open eachFolder
    delay 0.5
    activate eachFolder 
    tell application "System Events"
        keystroke "2" using {control down, command down} 
        keystroke "1" using {control down, option down, command down}    
    end tell
    close eachFolder
end repeat
end tell

Cela n'a pas fonctionné tel quel et a renvoyé l'erreur suivante: enter image description here

Donc, n'étant pas un expert en Applescript, j'ai un peu bidouillé avec la 4ème ligne de code:

set theFolders to every folder of entire contents of parentFolder as alias

et l'ai changé à ceci:

set theFolders to every folder of entire contents of parentFolder as list

et ça a fonctionné!

Quelques commentaires à ce sujet. Je l'ai utilisé pour modifier les paramètres d'affichage/tri de milliers de dossiers - dont la plupart je ne regarde pas, mais puisque c'était automatisé et facile, pourquoi pas. Je l'ai exécuté avec un délai de 0,1 au lieu de 0,5 et ça a bien fonctionné. Je ne l'ai pas essayé sans délai. Le seul accroc que j'ai rencontré était qu'il semblait y avoir une sorte de trou noir cumulatif associé au code. Lorsque je l'ai exécuté sur mon répertoire qui contenait des milliers de sous-dossiers, il a fallu près de 7 heures pour terminer l'opération. Le ventilateur de mon MacBook s'est déclenché lorsque la température du CPU a augmenté de façon drastique. Étrangement, le temps requis pour exécuter chaque ensemble de frappes a semblé augmenter avec le temps - cela devenait littéralement de plus en plus lent. Je n'ai pas pu faire de diagnostic car la routine ne s'exécutait pas en arrière-plan, mais se déroulait en fait comme si je le faisais manuellement. Je l'ai laissé s'exécuter toute la nuit et j'ai constaté que mon ordinateur était toujours lent, c'est-à-dire que tous les programmes tournaient lentement et la petite roue tournait pour les tâches les plus simples. J'ai réussi à ouvrir le Moniteur d'activité et j'ai remarqué que le processus WindowServer utilisait environ ~130% du CPU - comment cela est possible, je ne sais pas, mais c'est ce qui était indiqué. J'ai donc redémarré et le problème a disparu. Voici une capture d'écran du résumé de l'Automator affiché à la fin du processus:

enter image description here

Comme je l'ai dit, juste en dessous de 7 heures. Mais ça en valait la peine! Si je devais le refaire, je ne l'exécuterais que sur les répertoires principaux auxquels j'accède régulièrement. Maintenant je peux enfin retourner à ce que j'avais l'intention de faire au départ avant de trouver ce "problème" :) Malcolm in the Middle: Hal tente de changer une ampoule

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X