Hinweis: Das Problem mit delay
wurde in OS X 10.11 El Capitan behoben.
Seit ich auf Yosemite aktualisiert habe, funktionieren Applescripts, die Verzögerungen verwenden, nicht mehr. Wie kann ich das beheben?
Hier ist das einfachste Applescript der Welt, um ein einfaches Beispiel zu nennen:
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
Dies sollte 30 Sekunden dauern. Wenn ich es im Skript-Editor (früher Applescript-Editor) ausführe, dauert der Vorgang 30 Sekunden. Wenn ich dieses Skript jedoch als App speichere, werden beim Starten der App die Verzögerungen ignoriert und die App benötigt einen Bruchteil einer Sekunde.
Wie kann ich Applescript zwingen, eine bestimmte Zeitspanne zu verzögern, bevor ich mit dem nächsten Schritt fortfahre? Ist das ein Yosemite-Fehler? Gibt es eine zuverlässige Problemumgehung?
quelle
Antworten:
Hinweis: Das Problem mit
delay
wurde in OS X 10.11 El Capitan behoben.@ 2oh1, Sie haben die richtige Grundidee in Ihrer Antwort, aber hier ist eine vollständige und korrekte Antwort:
Die einzig vernünftige Möglichkeit, dies zu umgehen, besteht darin, "Verzögerung" innerhalb einer Schleife aufzurufen, die sicherstellt, dass die gewünschte Dauer vergeht, bevor Sie fortfahren. Der beste Weg, dies zu tun, besteht darin, "Verzögerung" mit einem benutzerdefinierten Handler zu überschreiben:
Auf diese Weise können Sie den Rest Ihres Skripts unverändert lassen und "Verzögerung" normal verwenden, z.
[HINWEIS: Normalerweise verwendet der benutzerdefinierte Handler "Verzögerungsdauer fortsetzen", um die integrierte "Verzögerung" aufzurufen. Ich habe jedoch festgestellt, dass dies zwar im Skript-Editor funktioniert, bei Verwendung in einem Applet jedoch einen Fehler zurückgibt ("Kann"). t Verzögerung fortsetzen. (-1708) ”). Ich habe dieses Problem umgangen, indem ich AppleScript direkt angewiesen habe, den Verzögerungsbefehl zu verarbeiten, anstatt "Weiter" zu verwenden, um dorthin zu gelangen.]
Das Problem besteht darin, dass
delay
Benutzereingaben verarbeitet werden, während das Skript angehalten wird, sodass Sie weiterhin auf Menüs oder Fenster klicken können, die von einem Applet angezeigt werden. Es gibt einen Fehler (in 10.11 behoben), bei dem Benutzereingaben dazu führendelay
, dass nicht die gesamte Dauer gewartet wird, bevor die Skriptausführung fortgesetzt wird . Wenn Sie nicht mit dem Applet interagieren,delay
funktioniert es ordnungsgemäß.quelle
Während ich mit demselben Problem kämpfte, stieß ich auf diese Antwort auf eine nicht so verwandte Frage und beschloss, es zu versuchen, und es scheint für mich zu funktionieren.
Ersetzen Sie einfach
delay 5
mitdo shell script "/bin/sleep 5"
und das gleiche Ergebnis.quelle
/bin/sleep
wartet auf die Schlafdauer und kehrt erst zurück, wenn sie abgeschlossen ist. Im Gegensatz dazu verarbeitet der in AppleScript integriertedelay
Befehl Benutzereingabeereignisse, während das Skript angehalten wird. (Hier liegt der Fehler: Wenn eine Benutzertastatur eingegeben wird, wirddelay
die Skriptausführung fortgesetzt, bevor die Verzögerungsdauer abgelaufen ist.)Ich sage nicht, dass dies die beste Lösung ist, aber es scheint mein Problem gelöst zu haben. Anstatt eine einfache Verzögerung zu verwenden, die aus Gründen, die ich nicht verstehe, ignoriert wird, habe ich auf das Abrufen der Zeit und das Schleifen umgestellt, bis eine neue Zeit erreicht ist (es wird immer noch eine Verzögerung verwendet, aber es spielt keine Rolle, ob sie ignoriert wird Die Verzögerung, da das Skript erst nach Erreichen der Zeit fortgesetzt wird.
Ich möchte immer noch wissen, warum Verzögerungen ignoriert werden (oder dramatisch beschleunigt werden ?! ??), aber das erledigt den Job, ungeschickt wie er ist.
quelle
delay
wird es weiter unterbrochen, bis etwas die Ereignisse behandelt und sie aus der Warteschlange entfernt.Ich habe eine Problemumgehung in einem deutschen Forumsbeitrag gefunden . Fügen Sie diese Zeilen oben in Ihr Skript ein:
quelle
delay
verarbeitet Benutzereingaben, während das Skript angehalten ist, sodass Sie beispielsweise weiterhin mit Menüs und Fenstern interagieren können.carzyj hatte meiner Meinung nach die beste Antwort, aber in Kombination mit der Methode von Chris Page erhalten Sie:
Sie können "on delay" bis "end delay" auskommentieren, um zur ursprünglichen Verzögerung zurückzukehren.
quelle
Dies ist eine Modifikation der @ chris-page-Lösung
Es scheint ein Gleichgewicht zwischen Reaktionsfähigkeit und genauer Erfassung der Verzögerung zu sein.
Aber anstatt Applescript anzuweisen, sich um die Gesamtdauer zu verzögern, sagen wir ihm nur, dass es sich um einen Bruchteil der Dauer verzögern soll. Wenn der Zeitraum kürzer ist als es der Apfel zulässt (1/60 Sekunde), setzen wir ihn einfach auf dieses Delta. Dass wir eine gewisse Reaktionsfähigkeit behalten und trotzdem genau sein können. Der Verdacht besteht darin, dass die Verzögerung manchmal nicht funktioniert, sodass die Wiederholung während der Schleife den Thread blockiert. In Erfolgsszenarien möchten wir jedoch, dass das Verzögerungsdelta kurz ist, damit der Prozess weiterhin unterbrochen werden kann
quelle
delay
so viel wie möglich verzögert werden kann, bevor die Ausführung fortgesetzt wird.delay endTime - (current date)
Dadurchdelay duration
wird sichergestellt, dass das Skript nicht länger als die ursprünglich angeforderte Zeit angehalten wird, wenn Siedelay
nicht unterbrochen werden. Dies war möglicherweise das, was Sie versucht haben Adresse mit dieser Antwort.Um alles zusammenzufassen, ich glaube, Chris meint das so:
quelle