14 votos

AppleScript "retraso" comando no funciona desde el interruptor a Yosemite

Nota: El problema con delay se fija en OS X 10.11 El Capitan.

Desde que he actualizado a Yosemite, Applescripts que el uso de los retrasos han dejado de funcionar. ¿Cómo puedo solucionar este problema?

Aquí está la más sencilla del mundo Applescript, por el bien de un ejemplo sencillo:

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

Que debe tomar 30 segundos para completar. Si lo ejecuto en el Editor de secuencias de Comandos (anteriormente el Editor Applescript) se tarda 30 segundos para completar. Pero si puedo guardar este script como una aplicación, cuando ejecuto la aplicación, los retrasos son ignorados y la aplicación toma una fracción de segundo para completar.

Cómo puedo forzar Applescript a la demora para una cantidad especificada de tiempo antes de pasar al siguiente paso? Es esta una de Yosemite glitch? Hay una fiable solución?

8voto

Yasmine Mustafa Puntos 21

Nota: El problema con delay se fija en OS X 10.11 El Capitan.

@2oh1, usted tiene el derecho básico de la idea en su respuesta, pero he aquí una respuesta completa y correcta:

La única manera de evitar esto es para invocar el "retraso" dentro de un bucle que asegura la duración deseada transcurre antes de continuar. La mejor manera de hacer esto es para anular el "retraso" con un controlador 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 resto de su secuencia de comandos sin cambios, y se puede utilizar "retraso" normalmente, por ejemplo,

delay 5
display alert "I like cake!"

[NOTA: Normalmente, el controlador personalizado usar "continuar duración de retardo" para invocar la incorporada en el "retraso", pero he encontrado que, a pesar de esto funciona dentro del Editor de secuencias de Comandos, se devuelve un error cuando se utiliza dentro de un applet ("no se Puede continuar con retraso. (-1708)"). He trabajado en torno a la cuestión directamente diciendo AppleScript para manejar el retraso de comandos en lugar de utilizar "continuar" para llegar allí.]

El problema es que delay procesos de la entrada del usuario durante la pausa de la secuencia de comandos, por lo que aún puede hacer clic en los menús o ventanas que aparecen por el uso de un applet, y hay un error (fijo en 10.11) donde la entrada del usuario provoca delay a no esperar todo el tiempo de duración antes de reanudar la ejecución del script. Si no interactuar con el applet, delay funciona correctamente.

6voto

mavit Puntos 156

Mientras luchando contra este mismo problema me encontré con esta respuesta a una no tan relacionados con la pregunta y decidí probarlo y parece que funciona para mí.

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

3voto

2oh1 Puntos 174

No estoy diciendo que esta es la mejor solución, pero parece que lo han solucionado mi problema. En lugar de utilizar un simple retraso, que está siendo ignorada por razones que no entiendo, me cambié a llegar el momento, en un bucle hasta que se alcanza el tiempo (todavía utiliza un retraso, pero no importa si se ignora el retraso, puesto que la secuencia de comandos no continúe hasta el momento se ha alcanzado).

# 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 estoy muriendo para saber por qué la demora se ignora (o dramáticamente acelerado?!??), pero este hace el trabajo, torpe como es.

2voto

zimbatm Puntos 2525

He encontrado un trabajo en un alemán post del foro. Añadir estas líneas en la parte superior de la secuencia de comandos:

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

0voto

Dickster Puntos 6

carzyj tenía lo que yo considero la mejor respuesta, pero cuando se combina con Chris Página del método, se obtiene:

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

Puede comentar "en la demora" a través de "end delay" para volver a la original de retraso.

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