1 votos

¿Por qué este Applescript a menudo falla la primera vez, pero siempre funciona después de eso?

El siguiente Applescript abre una aplicación de menú llamada QuickHue y luego hace clic en un elemento específico en el menú. A menudo, cuando uso el applescript, no hace nada. Pero si espero un momento o dos e intento de nuevo, funciona perfectamente. Y sigue funcionando. Pero si pasa un tiempo y lo activo de nuevo, fallará de nuevo la primera vez. Después de eso, funciona perfectamente. Aquí está el Applescript. ¿Alguna idea de qué está pasando aquí?

ignorando las respuestas de la aplicación
    decir a la aplicación "System Events" que diga al proceso "QuickHue"
        hacer clic en el elemento de la barra de menú 1 de la barra de menús 1
    end tell
end ignoring
hacer script de la cáscara "killall System\\ Events"
retraso 0.1
decir a la aplicación "System Events" que diga al proceso "QuickHue"
    decir al elemento de la barra de menú 1 de la barra de menús 1
        hacer clic en el elemento de menú 2 del menú 1
    end tell
end tell

1voto

Tienes razón, no lo probé lo suficiente. El error se mostraba cuando System Events no estaba en funcionamiento. Como solución temporal, agregué launch application "System Events" y delay 0.2 al inicio:

launch application "System Events"
delay 0.2
ignorando respuestas de la aplicación
    decir aplicación "System Events" para contar proceso "QuickHue"
        hacer clic en el elemento 1 de la barra de menú del menú 1
    fin decir
end ignorando
hacer script de la cáscara "killall System\\ Events"
delay 0.1
decir aplicación "System Events" para contar proceso "QuickHue"
    decir elemento 1 de la barra de menú del menú 1
        hacer clic en el elemento 2 del menú 1
    fin decir
end decir

Si aún no funciona, intenta aumentar los retrasos.

0voto

hepcat72 Puntos 103

Tal vez puedas escribir un bucle que lleve un registro de si el script ha tenido éxito o no e intente nuevamente hasta que lo logre (o haya pasado un cierto tiempo límite). Si de hecho el problema es que los eventos del sistema no se han iniciado por completo, entonces el bucle podría preguntar a los eventos del sistema si la aplicación eventos del sistema está en ejecución. Aquí tienes una función simple que podrías usar:

on appIsRunning(appName)
    tell application "System Events" to (name of processes) contains appName
end appIsRunning

Solo para asegurarse de que se haya iniciado por completo, podrías implementar tu retraso después del bucle.

Así es como se vería la función de bucle:

on startApp(appName)
    set IsRunning to false
    set tries to 20
    repeat until (IsRunning is true or tries is 0)
        set IsRunning to appIsRunning(appName)
        set tries to (tries - 1)
        delay 0.1
    end repeat

O tal vez tengas alguna otra forma de determinar el éxito de la ejecución del script... ¿hay algún estado que puedas verificar para determinar el éxito? Si es así, podrías repetir hasta que se cumpla esa condición en lugar de verificar si los eventos del sistema se han iniciado.

Otra cosa es que no sé si los eventos del sistema tienen que "registrarse" con AppleScript antes de que un AppleScript se active para que funcione. Si es así, entonces podrías intentar esto: puedes hacer un script auxiliar separado que inicie los eventos del sistema y luego ejecute tu script de esta manera:

startApp("System Events")
set myApp to "/Users/whatever/myScriptAsApp.app"
do shell script "open " & quoted form of POSIX path of myApp & " 2>&1 &"

Déjame saber cómo te va. Frecuentemente tengo el mismo problema que tú con un par de mis scripts. Todavía no he intentado esto.

Buena suerte, Rob

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