El command "demorar" de AppleScript no funciona desde que se cambió a Yosemite

Nota: El problema con la delay se corrigió en OS X 10.11 El Capitan.

Desde que me actualicé a Yosemite, las secuencias de commands que usan retrasos han dejado de funcionar. ¿Cómo puedo arreglar esto?

  • ¿Yosemite todavía permite el uso compartido de pantalla "por usuario"?
  • Equivalente a la function HeardWord de Dragon NaturallySpeaking en Dragon Dictate 4
  • Macbook incompatible 4,1 (2008) en 10.10.5 (Suplementario) - Sin audio después de la actualización - ¿Qué sigue?
  • Yosemite: ¿No se puede agregar una nota de text en una position arbitraria en Vista previa?
  • La visibilidad de Bonjour cae solo en Ethernet
  • ¿Cómo excluir una carpeta específica de la búsqueda de Spotlight pero no de la window de búsqueda?
  • Aquí está el Applescript más simple del mundo, por el simple ejemplo:

     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 para completar. Si lo ejecuto en Script Editor (anteriormente Applescript Editor) toma 30 segundos completarlo. Pero si guardo esta secuencia de commands como una aplicación, cuando la lance, las demoras se ignoran y la aplicación tarda una fracción de segundo en completarse.

    ¿Cómo puedo forzar a Applescript a retrasar durante un período de time específico antes de pasar al siguiente paso? ¿Es esto un error de Yosemite? ¿Hay una solución confiable?

  • Forzar iCloud Drive para que se sincronice con Yosemite
  • Eliminar Yosemite? Encuentra Mountain Lion? Explicaciones post-trazo, por favor
  • Las carpetas de iCloud Drive no se muestran en OS X
  • Diferentes opciones de cambio de charts en Yosemite
  • ¿Cómo arreglar GPT roto, GUID e inamovible, sin volúmenes de tipo?
  • ¿Pueden los posts de Mac OS X admitir más de una identificación de Apple?
  • 7 Solutions collect form web for “El command "demorar" de AppleScript no funciona desde que se cambió a Yosemite”

    Nota: El problema con la delay se corrigió 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 el "retraso" dentro de un ciclo que asegure que la duración deseada transcurra antes de continuar. La mejor forma de hacerlo es anular el "retraso" con un controller personalizado:

     on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime tell AppleScript to delay endTime - (current date) end repeat end delay 

    Esto le permite dejar el rest de su script sin cambios y puede usar "delay" normalmente, por ejemplo,

     delay 5 display alert "I like cake!" 

    [NOTA: normalmente, el controller personalizado usaría "continuar la duración del retraso" para invocar el "retraso" incorporado, pero descubrí que, aunque esto funciona dentro del Editor de scripts, devuelve un error cuando se usa dentro de un applet ("Puede") t continuar el retraso. (-1708) "). He solucionado ese problema al decirle directamente a AppleScript que maneje el command de demora en lugar de usar "continuar" para llegar allí.]

    El problema es que la delay procesa la input del usuario al pausar el script, por lo que aún puede hacer clic en los menus o windows que muestra un applet, y hay un error (reparado en 10.11) donde la input del usuario causa delay para no esperar toda la duración antes de reanudar ejecución de script Si no interactúa con el applet, el delay funciona correctamente.

    No digo que esta sea la mejor solución, pero parece que ha resuelto mi problema. En lugar de utilizar un retraso simple, que se ignora por razones que no entiendo, he cambiado para get el time y el bucle hasta que se alcanza un nuevo time (todavía utiliza un retraso, pero no importa si ignora el retraso ya que el script no continúa hasta que se alcanza el time).

     # Pause for five minutes set GetTheTime to current date set NewTime to GetTheTime + (5 * minutes) repeat while (current date) is less than NewTime delay 60 end repeat 

    Todavía me muero por saber por qué el retraso se ignora (o se acelera dramáticamente?!?), Pero esto hace el trabajo, torpe como es.

    Mientras luchaba contra este mismo problema, encontré esta respuesta a una pregunta no tan relacionada y decidí probarla y parece funcionar para mí.

    Simplemente reemplace el delay 5 con la do shell script "/bin/sleep 5" y obtenga el mismo resultado.

    Encontré un trabajo alternativo en una publicación en el foro alemán. Agregue estas líneas a la parte superior de su secuencia de commands:

     use framework "Foundation" use scripting additions current application's NSThread's sleepForTimeInterval:1 

    carzyj tenía lo que considero la mejor respuesta, pero cuando se combina con el método de Chris Page, obtienes:

     on delay duration do shell script "/bin/sleep " & duration end delay 

    Puede comentar "en retraso" a través de "retraso final" para volver al retraso original.

    esto es una modificación a la solución @ chris-page

    Parece ser un equilibrio entre la capacidad de respuesta y la captura precisa de la demora.

     on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime set delta to duration / 100 if duration < 0.2 then set delta to 0.2 end if tell AppleScript to delay delta end repeat end delay 

    Pero en lugar de decirle a Applescript que se demore la duración total, simplemente le pedimos que demore durante un período fraccional de la duración. si el período es menor que lo que permite apple (1/60 de segundo), entonces simplemente configurémoslo en ese delta. Que podemos mantener un poco de capacidad de respuesta, y aún así ser precisos. la sospecha es que a veces la demora no funciona, por lo que el bucle while de repetición mantendrá el hilo bloqueado, pero en escenarios de éxito, queremos que la demora delta sea breve para que el process pueda interrumpirse

    Entonces, para decirlo todo, creo que Chris quiere decir esto:

     on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime tell AppleScript to delay endTime - (current date) end repeat end delay 
    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).