14 votes

La commande AppleScript "delay" ne fonctionne pas depuis le passage à Yosemite

Note : Le problème avec delay a été corrigé dans OS X 10.11 El Capitan.

Depuis que j'ai mis à jour vers Yosemite, les appliscripts qui utilisent les délais ont cessé de fonctionner. Comment puis-je réparer cela ?

Voici l'Applescript le plus simple du monde, à titre d'exemple :

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

Cela devrait prendre 30 secondes. Si je l'exécute dans script Editor (anciennement Applescript Editor), cela prend 30 secondes. Mais si je sauvegarde ce script en tant qu'application, lorsque je lance l'application, les délais sont ignorés et l'application prend une fraction de seconde pour se terminer.

Comment puis-je obliger Applescript à attendre un certain temps avant de passer à l'étape suivante ? S'agit-il d'un problème lié à Yosemite ? Existe-t-il une solution de contournement fiable ?

8voto

Chris Page Points 7394

Note : Le problème avec delay a été corrigé dans OS X 10.11 El Capitan.

@2oh1, vous avez la bonne idée de base dans votre réponse, mais voici une réponse complète et correcte :

La seule façon raisonnable de contourner ce problème est d'invoquer "delay" dans une boucle qui s'assure que la durée souhaitée s'est écoulée avant de continuer. La meilleure façon de le faire est de remplacer "delay" par un gestionnaire personnalisé :

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

Cela vous permet de laisser le reste de votre script inchangé et vous pouvez utiliser "delay" normalement, par exemple,

delay 5
display alert "I like cake!"

[NOTE : Normalement, le gestionnaire personnalisé devrait utiliser "continue delay duration" pour invoquer le "delay" intégré, mais j'ai constaté que, bien que cela fonctionne dans l'éditeur script, il renvoie une erreur lorsqu'il est utilisé dans une applet ("Can't continue delay. (-1708)"). J'ai contourné ce problème en indiquant directement à AppleScript de traiter la commande de délai au lieu d'utiliser "continue" pour y parvenir].

Le problème est que delay traite l'entrée de l'utilisateur tout en mettant en pause le script, de sorte que vous pouvez toujours cliquer sur les menus ou les fenêtres affichés par une applet, et il existe un bogue (corrigé dans la 10.11) où l'entrée de l'utilisateur provoque des delay de ne pas attendre la durée totale avant de reprendre l'exécution du script. Si vous n'interagissez pas avec l'applet, delay fonctionne correctement.

6voto

mavit Points 211

En luttant contre ce même problème, je suis tombé sur cette réponse à un question sans rapport avec le sujet et j'ai décidé de l'essayer et ça semble fonctionner pour moi.

Remplacer delay 5 avec do shell script "/bin/sleep 5" et obtenir le même résultat.

3voto

2oh1 Points 857

Je ne dis pas que c'est la meilleure solution, mais elle semble avoir résolu mon problème. Au lieu d'utiliser un simple délai, qui est ignoré pour des raisons que je ne comprends pas, j'ai changé pour obtenir le temps et boucler jusqu'à ce qu'un nouveau temps soit atteint (il utilise toujours un délai, mais cela n'a pas d'importance s'il ignore le délai puisque le script ne continue pas jusqu'à ce que le temps soit atteint).

# 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

Je meurs toujours d'envie de savoir pourquoi le délai est ignoré (ou accéléré de façon spectaculaire ? !??), mais cela fait l'affaire, aussi maladroit soit-il.

2voto

zimbatm Points 2525

J'ai trouvé un moyen de contourner le problème dans un document allemand. post de forum . Ajoutez ces lignes au début de votre script :

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

0voto

Dickster Points 153

Carzyj avait ce que je considère comme la meilleure réponse, mais lorsqu'elle est combinée avec la méthode de Chris Page, on obtient :

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

Vous pouvez commenter "on delay" jusqu'à "end delay" pour revenir au délai initial.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X