Nota: El problema con delay
se solucionó en OS X 10.11 El Capitan.
Desde que me actualicé a Yosemite, los Applescripts que usan retrasos han dejado de funcionar. ¿Cómo puedo arreglar esto?
Aquí está el Applescript más simple del mundo, en aras de un ejemplo fácil:
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
Eso debería tomar 30 segundos en completarse. Si lo ejecuto en Script Editor (anteriormente Applescript Editor), tarda 30 segundos en completarse. Pero si guardo este script como una aplicación, cuando la ejecuto, los retrasos se ignoran y la aplicación tarda una fracción de segundo en completarse.
¿Cómo puedo obligar a Applescript a retrasarse durante un período de tiempo específico antes de pasar al siguiente paso? ¿Es esto un problema técnico de Yosemite? ¿Existe una solución confiable?
fuente
Respuestas:
Nota: El problema con
delay
se solucionó en OS X 10.11 El Capitan.@ 2oh1, tiene la idea básica correcta en su respuesta, pero aquí hay una respuesta completa y correcta:
La única forma razonable de evitar esto es invocar un "retraso" dentro de un ciclo que garantice que transcurra la duración deseada antes de continuar. La mejor manera de hacerlo es anular el "retraso" con un controlador personalizado:
Esto le permite dejar el resto de su script sin cambios y puede usar "delay" normalmente, por ejemplo,
[NOTA: Normalmente, el controlador personalizado usaría "duración de retraso continuo" para invocar el "retraso" incorporado, pero descubrí que, aunque esto funciona dentro del Editor de secuencias de comandos, devuelve un error cuando se usa dentro de un applet ("Can ' t continuar demora. (-1708) "). Resolví ese problema diciéndole directamente a AppleScript que manejara el comando de retraso en lugar de usar "continuar" para llegar allí.]
El problema es que
delay
procesa la entrada del usuario al pausar la secuencia de comandos, por lo que aún puede hacer clic en los menús o ventanas que muestra un applet, y hay un error (corregido en 10.11) donde la entrada del usuario hacedelay
que no espere la duración completa antes de reanudar la ejecución del script . Si no interactúa con el applet,delay
funciona correctamente.fuente
Mientras luchaba con este mismo problema, encontré esta respuesta a una pregunta no tan relacionada y decidí intentarlo y parece que funciona para mí.
Simplemente reemplace
delay 5
condo shell script "/bin/sleep 5"
y obtenga el mismo resultado.fuente
/bin/sleep
espera la duración del sueño y no regresa hasta que se haya completado. En contraste, eldelay
comando incorporado de AppleScript maneja los eventos de entrada del usuario mientras el script está en pausa. (Que es donde radica el error: si hay entrada de teclado del usuario,delay
continúa la ejecución del script antes de que se haya completado la duración del retraso.)No digo que esta sea la mejor solución, pero parece haber resuelto mi problema. En lugar de usar un retraso simple, que se ignora por razones que no entiendo, he cambiado a obtener el tiempo y hacer un bucle hasta que se alcanza un nuevo tiempo (todavía usa un retraso, pero no importa si ignora el retraso ya que el script no continúa hasta que se alcanza el tiempo).
Todavía me muero por saber por qué se ignora la demora (¿o se acelera dramáticamente?!?), Pero esto hace el trabajo, torpe como es.
fuente
delay
se continuará interrumpiendo hasta que algo maneje los eventos y los elimine de la cola.Encontré una solución en una publicación en un foro alemán . Agregue estas líneas a la parte superior de su script:
fuente
delay
procesa la entrada del usuario mientras el script está en pausa, por lo que aún puede interactuar con menús y ventanas, por ejemplo.carzyj tuvo lo que considero la mejor respuesta, pero cuando se combina con el método de Chris Page, obtienes:
Puede comentar "en retraso" a través de "fin de retraso" para volver al retraso original.
fuente
esta es una modificación de la solución @ chris-page
Parece ser un equilibrio entre la capacidad de respuesta y la captura precisa de la demora.
Pero en lugar de decirle a Applescript que se demore por la duración total, solo le decimos que se demore por un período fraccional de la duración. Si el período es menor que el que permite Apple (1/60 de segundo), entonces configurémoslo en ese delta. Que podemos mantener cierta capacidad de respuesta, pero aún así ser precisos. la sospecha es que a veces el retraso no funciona, por lo que la repetición del bucle mantendrá el hilo bloqueado, pero en los escenarios de éxito, queremos que el retraso delta sea corto para que el proceso aún se pueda interrumpir
fuente
delay
que permite retrasar tanto como sea posible antes de que continúe la ejecución.delay endTime - (current date)
lugar dedelay duration
, lo que garantiza que sidelay
no se interrumpe, no pausará el script por más tiempo que el tiempo solicitado originalmente, que puede haber sido lo que intentaba Dirección con esta respuesta.Entonces, para ponerlo todo junto, creo que Chris quiere decir esto:
fuente