0 votos

¿Cómo puedo automatizar varios comandos retrasados en AppleScript?

Digamos que quiero automatizar las siguientes tareas:

Envía la letra "a" dos veces cada 2 minutos

Enviar la letra "b" cada 30 minutos

y enviar la letra "C" cada 1 hora.

Si hago un bucle con retrasos en él, entonces no podré enviar repetidamente "a" - sólo puedo enviarlo una vez en el primer ciclo de 2 minutos, no cada vez. ¿Qué puedo hacer para juntar todos estos comandos? ¿Tengo que hacer varios scripts que se ejecuten?

2voto

user3439894 Puntos 5883

No sé si te das cuenta pero pulsaciones de teclas enviado por Eventos del sistema va al activo ventana más frontal de la aplicación más frontal y como tal el objetivo debe permanecer frente más y básicamente no puedes usar el ordenador para nada más mientras el proceso está ocurriendo.

El ejemplo AppleScript código que se muestra a continuación, se probó bajo MacOS Catalina como AppleScript aplicación stay open con Lengua y región ajustes en Preferencias del sistema ajustado a Inglés (EE.UU.) - Primaria y me ha funcionado sin problemas 1 .

  • 1 Asume la configuración necesaria y adecuada en <strong>Preferencias del sistema </strong>> <strong>Seguridad y privacidad </strong>> <strong>Privacidad </strong>se han fijado/abordado según las necesidades.

En Script Editor , copie y pegue el ejemplo AppleScript código en un nuevo documento y cambiar "TextEdit" y "Untitled" a los valores adecuados para el objetivo aplicación y ventana quieres el pulsaciones de teclas para ir a. Los valores existentes eran de prueba.

Al guardar, en el Guardar como: hoja , cambio Formato de archivo: a [Aplicación] y bajo Opciones: compruebe el [] Permanecer abierto después de la ejecución del manipulador casilla de verificación .


Ejemplo AppleScript código :

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

Notas:

Si sólo está automatizando la introducción de texto en un cuadro de texto o documento, puede eliminar uno de los my sendKeystroke("a") y cambiar la otra por my sendKeystroke("aa") , en caso contrario, si se simula un clave para, digamos, un juego, entonces probablemente lo querrás tal y como está codificado actualmente.

Guiones de interfaz de usuario puede ser poco fiable y propenso a fallar.

Algunos aplicaciones no responderá a keystroke y o key code comandos de Eventos del sistema ya que están diseñadas para no responder a este tipo de evento de esta manera. Juegos son el tipo típico de aplicación que pueden no responder.

Personalmente, no me gusta este tipo de Guiones de interfaz de usuario y he publicado esto más como una prueba de concepto. Según mi experiencia, algunos AppleScript mantener abiertas las solicitudes puede, con el tiempo, consumir más memoria y acabar colapsando. También pueden hacer que los ventiladores giren y mantengan altas RPM. Esto probablemente tiene que ver más con algunos de los código que se está ejecutando, sin embargo, como regla general, trato de realizar la tarea de una manera diferente que no se convierta en un recurso intensivo, si es posible.

Crédito a Tetsujin por su comentario a la OP, que fue la base de esta respuesta.


Nota: El <em>ejemplo </em><strong>AppleScript </strong><em>código </em>es sólo eso y sin ningún tipo de inclusión <em>tratamiento de errores </em>no contiene ningún otro <em>tratamiento de errores </em>según corresponda. Corresponde al usuario añadir cualquier <em>tratamiento de errores </em>como sea apropiado, necesario o deseado. Eche un vistazo a 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>pruebe con </strong></a><em>declaración </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>error </strong></a><em>declaración </em>en el <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guía del lenguaje AppleScript </strong></a>. Véase también, <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>Trabajar con errores </strong></a>. Además, el uso 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>retraso </strong></a><em>comando </em>puede ser necesario entre eventos cuando sea apropiado, por ejemplo <code>delay 0.5</code> con el <em>valor </em>de la <em>retraso </em>ajustado apropiadamente.

0voto

Aaron Puntos 1

Esto es lo que se me ocurrió, pero con un uso modificado para enviar cada 10 y 40 segundos:

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X