0 votes

Comment automatiser plusieurs commandes différées dans AppleScript ?

Disons que je veux automatiser les tâches suivantes :

Envoyer la lettre "a" deux fois toutes les 2 minutes

Envoyez la lettre "b" toutes les 30 minutes

et envoyer la lettre "C" toutes les 1 heure.

Si je crée une boucle avec des délais, je ne pourrai pas envoyer "a" de manière répétée - je ne peux l'envoyer qu'une fois dans le premier cycle de 2 minutes, pas à chaque fois. Que puis-je faire pour assembler toutes ces commandes ? Dois-je simplement faire plusieurs scripts en cours d'exécution ?

2voto

user3439894 Points 52496

Je ne sais pas si vous vous en rendez compte, mais les clés de voûte envoyé par Événements du système va vers l'actif fenêtre la plus à l'avant de la application frontale et en tant que telle, la cible doit rester le plus avant et vous ne pouvez pas utiliser l'ordinateur pour autre chose pendant que le processus se déroule.

El exemple AppleScript code montré ci-dessous, a été testé sous MacOS Catalina comme un AppleScript demande d'ouverture permanente avec Langue et région paramètres dans Préférences du système réglé sur Anglais (US) - Primaire et a fonctionné pour moi sans problème 1 .

  • 1 Assume la mise en place nécessaire et appropriée dans <strong>Préférences du système </strong>> <strong>Sécurité et confidentialité </strong>> <strong>Vie privée </strong>ont été fixés/réglés selon les besoins.

En scriptÉditeur copier et coller le exemple AppleScript code dans un nouveau document et changez "TextEdit" y "Untitled" aux valeurs appropriées pour la cible application y fenêtre vous voulez le les clés de voûte pour aller à. Les valeurs existantes étaient destinées à des fins de test.

Lors de la sauvegarde, sur le Sauvez comme : feuille le changement Format de fichier : a [Application] et sous Options : vérifier le [] Rester ouvert après le gestionnaire d'exécution case à cocher .


Exemple AppleScript code :

property appName : "TextEdit"
property winName : "Untitled"

global theCounter

on run
    set theCounter to 0
    delay 60
end run

on idle
    my isItTimetoSendKeystroke()
    return 60
end idle

on isItTimetoSendKeystroke()
    set theCounter to theCounter + 1
    if (theCounter mod 2) = 0 then
        my sendKeystroke("a")
        my sendKeystroke("a")
    end if
    if (theCounter mod 30) = 0 then
        my sendKeystroke("b")
    end if
    if (theCounter mod 60) = 0 then
        my sendKeystroke("C")
    end if
end isItTimetoSendKeystroke

to sendKeystroke(thisKey)
    tell application "System Events"
        tell application process appName
            set frontmost to true
            perform action "AXRaise" of window winName
            keystroke thisKey
        end tell
    end tell
end sendKeystroke

on quit
    continue quit
end quit

Notes :

Si vous vous contentez d'automatiser la saisie de texte dans une zone de texte ou un document, vous pouvez supprimer l'un des éléments suivants my sendKeystroke("a") et changer l'autre en my sendKeystroke("aa") sinon, si l'on simule une clé pour, disons, un jeu, vous voudrez probablement l'utiliser tel qu'il est actuellement codé.

Scripting de l'interface utilisateur peuvent être maladroites et sujettes à l'échec.

Quelques applications ne répondra pas à keystroke et ou key code commandes de Événements du système car elles sont conçues pour ne pas répondre à ce type de problème. événement de cette manière. Jeux sont le type typique de application qui peuvent ne pas répondre.

Personnellement, je n'aime pas ce type de Scripting de l'interface utilisateur et j'ai posté ce document comme une preuve de concept. D'après mon expérience, certains AppleScript les applications ouvertes en permanence peut, avec le temps, consommer plus de mémoire et finir par planter. Ils peuvent également faire tourner les ventilateurs et les maintenir à des vitesses élevées. Cela a probablement plus à voir avec certaines des technologies de l'information et de la communication. code Cependant, en règle générale, j'essaie d'accomplir la tâche d'une manière différente qui ne soit pas gourmande en ressources, si possible.

Crédit à Tetsujin pour son commentaire à l'OP, qui était la base de cette réponse.


Note : Le <em>exemple </em><strong>AppleScript </strong><em>code </em>est juste cela et sans aucune inclusion <em>gestion des erreurs </em>ne contient pas d'autres <em>gestion des erreurs </em>comme il se doit. C'est à l'utilisateur qu'il incombe d'ajouter toute <em>traitement des erreurs </em>selon ce qui est approprié, nécessaire ou souhaité. Jetez un coup d'œil à la <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129232" rel="nofollow noreferrer"><strong>essayez </strong></a><em>déclaration </em>y <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129657" rel="nofollow noreferrer"><strong>erreur </strong></a><em>déclaration </em>dans le <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guide du langage AppleScript </strong></a>. Voir aussi, <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_xmpls.html#//apple_ref/doc/uid/TP40000983-CH221-SW1" rel="nofollow noreferrer"><strong>Travailler avec des erreurs </strong></a>. En outre, l'utilisation de la <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW10" rel="nofollow noreferrer"><strong>retarder </strong></a><em>commande </em>peut être nécessaire entre les événements, le cas échéant, par ex. <code>delay 0.5</code> avec le <em>valeur </em>de la <em>retarder </em>définis de manière appropriée.

0voto

Aaron Points 23

Voici ce que j'ai pu mettre au point, mais avec une utilisation modifiée pour envoyer toutes les 10 et 40 secondes :

set countTime to 0
set e to 0

    repeat while e < 42069
        tell application "System Events"
            keystroke "a"
            keystroke return
            if (countTime mod 40 = 0) then
                 keystroke "b"
            end if

        end tell
        set countTime to countTime + 10
        delay 10
        set e to e + 1
    end repeat

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