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?

  • En una tabla, ¿cómo se colorean las columnas (en lugar de las filas)?
  • Deshabilitar auto sugiere escritura cuando se usa la tecla CTRL
  • Habilite No molestar en el Centro de notifications cuando se abra determinada aplicación
  • Los posts no se abrirán: la database de Mensajes se está actualizando
  • RedQuits (o alternativa) en Mac OS X 10.10
  • MBP se bloquea después de despertar de un largo sueño después de la installation de Yosemite
  • 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?

  • Actualización de Yosemite a El Capitán, pero no Sierra
  • Evite las annotations de text no deseado / en blanco en Preview.app
  • Descarga de file 'Desconocido' después de volver a cargar en Safari 8.0 en OS X Yosemite
  • Se cambió la contraseña del usuario al proporcionar una nueva contraseña, ya que el hash no se sincroniza con Filevault 2
  • Consejo de Yosemite / Consejo de configuration de dominio
  • Tema de Mavericks para Yosemite
  • 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).