Applescript führt Code zu einem bestimmten Zeitpunkt aus

Ich habe versucht, ein Skript auf verschiedene Weise zu einem bestimmten Zeitplan / zu einer bestimmten Zeit auszuführen. Ich fand Lingon ziemlich praktisch. Ich versuche auch, den Kalender zu verwenden, aber das Ergebnis war sehr schlecht.

Ich habe das geschrieben :

repeat
    set myDate to date string of (current date)


    set myTime to time string of (current date)

    set myDateTime to myDate & " - " & myTime

    if myTime > "11:30:00" and myTime < "11:30:10" then
        display notification "demo - This is the time"
    end if
end repeat

was gut zu funktionieren scheint, aber offensichtlich ein paar Benachrichtigungen generiert. Wie kann ich ein Skript nur einmal ausführen, wenn diese Bedingung gefunden wird?

Ich dachte, ich kann mit etwas Verspätung spielen, aber dann mache ich mir Sorgen, dass ich die Zeitbedingung verpassen würde.

Warum nicht einfach Lingon verwenden?
Ich möchte in der Lage sein, das Skript schnell und ein bisschen zufällig zu planen oder zu stoppen, ich möchte es auch nicht ausführen, wenn ich nicht hier bin, obwohl ich lieber ein einfaches Applescript verwende, aber das scheint am Ende trotzdem gut zu funktionieren

Antworten (3)

Dies ist nur eine etwas effizientere Wiederholung der vorhandenen Antwort ...

set gIsThisTime to false

repeat until gIsThisTime is true
    delay 60
    set myTime to time string of (current date)
    if myTime > "1:15:00 pm" and myTime < "1:20:00 pm" then
        set gIsThisTime to true
    end if
end repeat

set myDate to date string of (current date)
set myDateTime to myDate & " - " & myTime
display notification "time = " & myDateTime

Hinweise:
Auslassen von am/pm bedeutet, dass es entweder am oder am Nachmittag ausgelöst wird, was immer es zuerst trifft,
es funktioniert nicht im 24-Stunden-Format, also wird 13:15:00 nicht ausgelöst

ÜBERARBEITETE LÖSUNG:

Der AppleScript-Code, den ich in meiner ersten Lösung verwendet habe, verwendete eine repeat until theTime is greater than or equal to requested_timeSchleife mit einem delay 10Befehl, um die aktuelle Zeit alle 10 Sekunden mit der angeforderten Zeit zu vergleichen. Obwohl dieser Code als Skript oder Anwendung ausgeführt wurde, verbrauchte er keine große Menge an Systemressourcen ... Das Speichern des neuen folgenden AppleScript-Codes als offen bleibende Anwendung mit einem on runand- on idleHandler hatte meiner Meinung nach deutlich weniger Auswirkungen auf den Systemressourcen. Speichern Sie den folgenden AppleScript-Code als geöffnet bleibende Anwendung.

Wenn diese App ausgeführt wird, können Sie Ihre gewünschte Zeit eingeben und dann eine Datei oder App auswählen, die zu diesem bestimmten Zeitpunkt gestartet werden soll.

Dieser AppleScript-Code funktioniert bei mir mit der neuesten Version von macOS Mojave.

global chosenApp
property theTime : missing value
property requested_time : missing value

on run
    set theTime to time string of (current date)
    activate
    set requested_time to text returned of (display dialog ¬
        "Please Enter Your Start Time With The Following Format: Hour:Minutes:Seconds" default answer theTime ¬
        buttons {"CANCEL", "OK"} default button "OK" cancel button "CANCEL" with title ¬
        "Choose App Launch Time")
    activate
    set chosenApp to choose file with prompt ¬
        "Choose The App Or File You Would Like To Run At Your Specified Time" without multiple selections allowed, invisibles and showing package contents
end run

on idle
    runAtSpecificTime()
    return 30 -- in seconds
end idle

on runAtSpecificTime()
    set theTime to time string of (current date)
    if theTime is greater than or equal to requested_time then
        tell application "Finder" to open chosenApp
        quit me
    end if
end runAtSpecificTime

on quit
    continue quit -- allows the script to quit
end quit

Ok ich glaube ich habe es gefunden:

set isThisTime to false
repeat
    set myDate to date string of (current date)


    set myTime to time string of (current date)

    set myDateTime to myDate & " - " & myTime

    if myTime > "11:30:00" and myTime < "11:47:26" then
        set isThisTime to true
        exit repeat
    end if
end repeat

if isThisTime is true then
    display notification "in the time"
end if
Ich bin kein Programmierer, aber für mich sieht es so aus, als würde es die ganze Zeit mit voller Taktgeschwindigkeit auf diesen Zyklus hämmern, bis TRUE ausgelöst wird. Wenn es keinen besseren Weg gibt - cron oder etwas über meiner Gehaltsstufe -, würde ich einen großen Verzögerungstimer in die While-Schleife einfügen, es sei denn, Sie benötigen eine Genauigkeit im Millisekundenbereich. Du rufst auch immer wieder das Datum auf, das wirklich nur einmal gebraucht zu werden scheint, bei init.
Es ist nur so, dass ich dieses Skript nicht die ganze Zeit ausführen möchte, und ich möchte es sehr schnell stoppen können, obwohl ich Cron nicht verwende, aber ja, ich denke, ich werde auf meine erste Idee zurückkommen, um etwas Verzögerung hinzuzufügen auch wenn es bisher gut zu funktionieren scheint
Yup - ich würde auch alle sinnlosen Wiederholungen entfernen. Wenn es die Zeit in einer Schleife überprüft, muss es dort nichts anderes tun. Ziehen Sie alles andere in Globals oder deklarieren Sie, wann Sie sie brauchen, anstatt jedes Mal lokale Variablen zu erstellen/zerstören. Es ist nicht viel „Arbeit“, aber es ist „Arbeit“, die es nicht tun muss.