Erweiterte AppleScript-Techniken
() translation by (you can also view the original English article)
Wir haben zuvor eine grundlegende Einführung in AppleScript angeboten. Dieser Artikel enthält eine Reihe nützlicher AppleScript-Tipps und -Tricks, mit denen Sie einige erstaunliche erweiterte Skripte erstellen können.
Das ist Teil einer Reihe von Beiträgen, in denen einige der beliebtesten Tutorials unserer Leser aus der Vergangenheit wiederholt werden, die immer noch großartige und relevante Informationen enthalten, die Sie möglicherweise nützlich finden. Dieser Beitrag wurde ursprünglich am 24. September 2009 veröffentlicht.
Machen Sie zuerst Ihre Hausaufgaben
Dies ist der dritte Artikel in meiner Reihe über Automatisierung. Lesen Sie unbedingt meine Anfängerhandbücher zu AppleScript und Automator, um sich mit Skripten und Automatisierung im Allgemeinen vertraut zu machen.
In diesen Artikeln beschreibe ich grundlegende Funktionen wie Variablen, die ich hier nicht erläutere, um die Redundanz zu verringern. Nachdem Sie sich mit AppleScript vertraut gemacht haben, können Sie mit den guten Dingen beginnen. Lass uns anfangen!
If und If, Else
Die Anweisungen "If" und "if, else" werden verwendet, wenn Sie über einen bestimmten Befehl oder eine Reihe von Befehlen verfügen, die das Skript nur ausführen soll, wenn die angegebenen Anforderungen erfüllt sind.
Angenommen, Sie möchten, dass das Skript Ihnen mitteilt, ob der Wert der beiden Variablen x und y gleich oder unterschiedlich ist. Sie würden eine "if"-Anweisung verwenden, um dem Skript mitzuteilen, wie auf jede Situation reagiert werden soll.
Es gibt nur drei Möglichkeiten: x ist größer als y, y ist größer als x oder x = y. Beginnen wir mit einer grundlegenden "if"-Anweisung und machen sie im Laufe der Zeit komplexer.
[applescript]
--Variablen deklarieren
setzen Sie x auf 5
setzen Sie y auf 78
--Run if Statement
if x < y dann
return "yes"
end if
[/applescript]
Hier habe ich zuerst zwei Variablen deklariert und jedem Werte zugewiesen. Dann sagte ich dem Skript-Editor, er solle "yes" zurückgeben, wenn x größer als y ist. Beachten Sie, dass die Struktur der "if"-Anweisung einem Tell-Block sehr ähnlich ist. Sie müssen jede "if"-Anweisung mit "end if" beenden, sonst wird Ihr Code nicht kompiliert.
Sie beenden jede "if"-Anweisung mit "end if" oder Ihr Code wird nicht kompiliert.
Die Grundstruktur der Anweisung lautet wie folgt: Wenn (eine bestimmte Anweisung) wahr ist, gehen Sie wie folgt vor. Stellen Sie sicher, dass Sie die zu testende Anweisung und "then" in dieselbe Zeile wie "if" einfügen.
Platzieren Sie dann Ihre Anweisungen in der nächsten Zeile (n), bevor Sie den Block beenden. Wenn Sie die obige Anweisung kompilieren und ausführen, sollte der Skript-Editor "yes" zurückgeben, um anzuzeigen, dass x tatsächlich kleiner als y ist. Wenn x größer als y wäre, würde nichts passieren, da wir nicht für diese Kontingenz programmiert haben. Versuchen wir etwas komplexeres.
[applescript]
--Variablen deklarieren
setzen Sie x auf 78
setzen Sie y auf 5
--Run if Statement
if x < y dann
return "yes"
else
return "no"
end if
[/applescript]
Hier haben wir eine "else"-Anweisung eingefügt, die dem Skripteditor mitteilt, was zu tun ist, wenn die anfängliche bedingte Anweisung falsch ist. Die Struktur ist wie folgt: Wenn (eine gegebene Aussage) wahr ist, führen Sie Aktion a aus, andernfalls führen Sie Aktion b aus.
Das ist für viele Situationen ausreichend, aber wir haben noch keine Kontingenz für unsere dritte Situation geschaffen: x = y. Um dies zu erreichen, verwenden wir "else if".
[applescript]
--Variablen deklarieren
setzen Sie x auf 5
setzen Sie y auf 5
--Run if Statement
if x < y then
return "x is less than y"
else if x > y then
return "x is greater than y"
else
return "x is equal to y"
end if
[/applescript]
Hier haben wir alle drei verschiedenen Szenarien berücksichtigt. Das Ausführen dieses Skripts sollte "x is equal to y." zurückgeben. Beachten Sie, dass für das letzte Szenario nur ein "else" anstelle eines "else if" erforderlich ist. Das liegt daran, dass wenn die ersten beiden Anweisungen falsch sind, x = y sein muss (abgesehen von Eingabefehlern).
Boolesche Werte
Das Zuweisen eines Wahrheitswertes zu einer Variablen ist einfach. Setzen Sie die Variable einfach auf true oder false.
[applescript]
Setzen Sie den Booleschen Wert auf false
if theBoolean = true then
return "It's true!"
else
return "That's just not true"
end if
[/applescript]
Im Moment wissen Sie einfach, dass es so einfach ist. Wir werden im letzten Beispiel eine praktischere Verwendung sehen.
Dialogfeld anzeigen
AppleScript macht es sehr einfach, die Ausgabe für einen Benutzer anzuzeigen. Geben Sie einfach Folgendes ein:
[applescript]
Anzeigedialog "Greetings!"
[/applescript]
Das sollte ein einfaches Fenster erzeugen, in dem Ihre Begrüßung und zwei Schaltflächen angezeigt werden: "Abbrechen" und "OK". Es ist auch möglich, diese Schaltflächen mit dem folgenden Code anzupassen:
[applescript]
Anzeigedialog "Wie geht es dir?" Schaltflächen {"Great", "Horrible", "None of your business!"} Standardschaltfläche 3
[/applescript]
Dieser Code besteht aus drei Abschnitten. Der erste Abschnitt zeigt ein Dialogfeld mit dem Text "Wie geht es Ihnen?" Der zweite Abschnitt legt fest, wie viele Schaltflächen der Dialog enthält und was sie sagen. In diesem Fall haben wir drei Tasten. Beachten Sie, dass die Schaltflächen in Klammern und jede Schaltfläche in Anführungszeichen gesetzt werden müssen.
Beachten Sie, dass die Schaltflächen in Klammern und jede Schaltfläche in Anführungszeichen gesetzt werden müssen.



Der resultierende Dialog
Schließlich teilt der dritte Abschnitt dem Dialogfeld mit, wie die Standardschaltfläche lauten soll. Wenn Sie die Standardschaltfläche auf 3 setzen, wird die dritte Schaltfläche hervorgehoben, wenn der Dialog angezeigt wird.
Ein Dialog mit mehreren Schaltflächen ist großartig, aber es ist nicht gut, wenn Sie nicht wissen, wie Sie die vom Benutzer erhaltenen Eingaben verwenden. Nehmen wir das, was wir gerade über Dialoge gelernt haben, und kombinieren es mit einer "if, else"-Anweisung, um zu sehen, wie wir Dialoge verwenden können, um einen... nun... Dialog fortzusetzen.
[applescript]
--Erstellen Sie einen Dialog mit 3 Schaltflächen
Anzeigedialog "Wie geht es dir?" Schaltflächen {"Great", "Horrible", "None of your business!"} Standardschaltfläche 1
--Wenn der Benutzer großartig ist
if result = {button returned:"Great"} then
Anzeigedialog "Excellent, carry on good sir"
--Wenn der Benutzer schrecklich ist
else if result = {button returned:"Horrible"} then
Anzeigedialog "You need to cheer up!"
--Wenn der Benutzer ein Idiot ist
else
Anzeigedialog "Excuse me pal!"
end if
[/applescript]
Wie Sie sehen können, stammt die erste Codezeile direkt aus dem obigen Beispiel. Der nächste Abschnitt verwendet eine "if, else"-Anweisung, um jeden Tastendruck zu verarbeiten. Die Syntax lautet im Wesentlichen: Wenn der Benutzer die Taste x drückt, führen Sie Aktion a aus, andernfalls, wenn der Benutzer die Taste y drückt, dann Aktion b, andernfalls Aktion c.
Wenn der Benutzer die Taste x drückt, führen Sie die Aktion a aus. Wenn der Benutzer die Taste y drückt, führen Sie die Aktion b aus, andernfalls die Aktion c.
Empfangen von Texteingaben von einem Benutzer
Manchmal reicht ein einfacher Knopf nicht aus. Ich schreibe häufig Skripte, bei denen der Benutzer Text eingeben muss. Um dies zu erreichen, verwenden wir ein Dialogfeld wie oben mit einer etwas anderen Syntax.
[applescript]
--Dialogfeld anzeigen und Eingabe abrufen
Anzeigedialog "Wie geht es Ihnen?" Standardantwort "Sagen Sie mir, wie Sie sich fühlen"
--Antwort erhalten & Kommentar zurücksenden
Setzen Sie die Antwort auf (vom Ergebnis zurückgegebener Text)
Anzeigedialog "Ich bin froh, dass Sie sich so fühlen" & theAnswer
[/applescript]
Indem wir eine "Standardantwort" in unseren Code einfügen, teilen wir AppeScript mit, dass der Benutzer als Antwort Text eingeben soll. Wir setzen dann eine Variable auf den vom Benutzer zurückgegebenen Text. Dann können wir diese Variable überall dort verwenden, wo wir die Eingabe verwenden möchten.



Empfangen von Texteingaben von einem Benutzer
Fehlerbehandlung: Der Try-Block
Es ist gefährlich, Benutzer Daten eingeben zu lassen. Wenn Sie nach einer ganz bestimmten Antwort oder einem bestimmten Datentyp suchen, können Sie sicher sein, dass Ihre Benutzer dies vermasseln und einen Fehler verursachen.
Wenn Sie nach einer ganz bestimmten Antwort oder einem bestimmten Datentyp suchen, können Sie sicher sein, dass Ihre Benutzer dies vermasseln und einen Fehler verursachen.
Aus diesem Grund müssen Sie filtern, was vom Benutzer eingeht, um sicherzustellen, dass es genau die Art von Eingabe ist, die Sie möchten. Dazu verwenden wir einen try-Block und einige "if"-Anweisungen.
[applescript]
--Dialogfeld anzeigen und Eingabe abrufen
Anzeigedialog "Wählen Sie eine Nummer 1-10" Standardantwort "Geben Sie nur Zahlen unter 11 ein!"
--Test für ungültige Zeichen
try
Setzen Sie die Antwort als Nummer auf (vom Ergebnis zurückgegebener Text)
on error
Anzeigedialog "Invalid Input"
return
end try
--Test auf korrekte Zahlen
if theAnswer < 1 then
set theTest to 0
else if theAnswer < 11 then
set theTest to 1
else
set theTest to 0
end if
--Kommentare an Benutzer zurückgeben
if theTest = 0 then
Anzeigedialog "Invalid Input"
else
Anzeigedialog "You chose the number" & theAnswer
end if
[/applescript]
Der obige Code ist kompliziert, also lassen Sie uns ihn aufschlüsseln. Der erste Abschnitt zeigt einfach einen Dialog an und fordert den Benutzer auf, eine Nummer auszuwählen. Wir wollen jedoch nur die Nummern eins bis zehn akzeptieren. Wenn etwas anderes eingegeben wird, möchten wir dem Benutzer mitteilen, dass die Eingabe ungültig war.
Im zweiten Abschnitt testen wir, ob Nicht-Zahlen wie Buchstaben oder Symbole eingegeben wurden. Mit einem try-Block können wir AppleScript anweisen, den Code auszuführen und zu sehen, was passiert.
Mit einem try-Block können wir AppleScript anweisen, den Code auszuführen und zu sehen, was passiert.
Hier haben wir AppleScript angewiesen, zu versuchen, den vom Benutzer zurückgegebenen Text in eine Zahl umzuwandeln. Wenn es keinen try-Block gäbe und wir diesen Befehl ausführen würden, würde dies einen Fehler auslösen und das Programm beenden, wenn der Benutzer einen Buchstaben oder ein Symbol eingibt.
Mit dem try-Block können wir AppleScript jedoch einen speziellen Befehl geben, wenn ein Fehler ausgegeben wird. In diesem Fall wird ein Dialogfeld "Ungültige Eingabe" angezeigt, wenn ein Fehler ausgegeben wird. Wir befehlen dann dem Skript, mit der Eingabe von "return" zu enden. Beachten Sie, dass ein try-Block mit dem Befehl "end try" enden muss.
Bei der Programmierung müssen Sie immer jeden möglichen Fehler berücksichtigen, den Ihre Benutzer machen können, und eine Kontingenz dafür erstellen. Führen Sie den obigen Code aus und geben Sie einige ungültige Zeichen ein. Sie können sehen, dass das Skript unabhängig von Ihrer Eingabe nur die Nummern 1-10 akzeptiert.
Bei der Programmierung müssen Sie immer jeden möglichen Fehler berücksichtigen, den Ihre Benutzer machen können, und eine Kontingenz dafür erstellen.
Handler
So wie Variablen viele Informationen in einem kleinen Codeausschnitt speichern, sind Handler (in anderen Programmiersprachen häufig als Funktionen bezeichnet) eine hervorragende Möglichkeit, eine große Anzahl von Befehlen mit sehr wenig Code wiederholt auszuführen.
Durch das Speichern mehrerer Befehle in einem Snippet sparen Sie sich viel Programmierung und vereinfachen Ihren Code erheblich. Hier ist ein Beispiel:
[applescript]
--Handler definieren
auf additionHandler(theVariable)
setzen Sie x auf 5
setzen Sie y auf 5
setzen Sie z auf x + y + theVariable
Anzeigedialog "10 +" & theVariable & " = " & z
end additionHandler
--Run Handler
additionHandler(8)
--Handler erneut ausführen
Setzen Sie die Nummer auf 145
additionHandler(theNumber)
[/applescript]
Die Syntax zum Definieren eines Handlers lautet: on HandlerName (Variable), gefolgt von den auszuführenden Befehlen, gefolgt von "end handlerName".
Die Variable in Klammern (theVariable) ist der Teil, den wir jedes Mal definieren müssen, wenn wir den Handler ausführen. Der erste Codeabschnitt selbst führt zu nichts, da wir den Handler noch nicht ausgeführt, sondern nur definiert haben.
Beachten Sie, dass wir beim Ausführen des Handlers den Namen des Handlers gefolgt von einer Zahl in Klammern eingeben. Der Handler nimmt nun diese Nummer und fügt sie an einer beliebigen Stelle ein, die wir "theVariable" in unsere Handlerdefinition eingegeben haben.
In diesem Fall wird die ausgewählte Variable auf z gesetzt und zu x (5) und y (5) hinzugefügt und ein Dialogfeld mit der Antwort angezeigt. Additionshandler (8) setzt also z auf 8 und addiert dann 10 (5+5) und gibt das Ergebnis von 18. Wenn wir den Handler erneut ausführen, wird derselbe Code auf einer anderen Zahl ausgeführt.
Ich habe dies getan, um Ihnen zu zeigen, dass Sie eine Variable an anderer Stelle definieren und in Ihren Handler einfügen können. Hier haben wir die Nummer auf 145 gesetzt und dann den Handler auf der Nummer ausgeführt.
Beachten Sie, dass innerhalb eines Handlers definierte Variablen außerhalb des Handlers nicht vorhanden sind. Wenn Sie dieses Skript mit "return z" beenden, wird eine Fehlermeldung angezeigt, die besagt, dass "z" nicht definiert ist.
Geben Sie allen Ihren Variablen beschreibende und eindeutige Namen.
Das bedeutet, dass Sie technisch identische Variablennamen für Variablen verwenden können, die innerhalb und außerhalb eines Handlers definiert sind. Das führt jedoch zu unordentlichem und verwirrendem Code und sollte vermieden werden. Geben Sie einfach allen Ihren Variablen beschreibende und eindeutige Namen.
Blöcke wiederholen
Es ist häufig der Fall, dass Sie einen Schritt in Ihrem Skript erstellen müssen, der eine bestimmte Anzahl von Malen wiederholt wird.
In AppleScript führen wir Schleifen mit Wiederholungsblöcken durch.
Viele Programmiersprachen nennen dies eine Schleife. In AppleScript führen wir Schleifen mit Wiederholungsblöcken durch. Wiederholungsblöcke sind ziemlich einfach und vielseitig. Hier ein einfaches Beispiel:
[applescript]
Setzen Sie theNumber auf 5
Wiederholen Sie theNumber mal
Anzeigedialog "Ist das nicht ärgerlich?"
end repeat
[/applescript]
Hier haben wir ein Dialogfeld erstellt und es so eingestellt, dass es fünfmal hintereinander wiederholt wird. Dieses Beispiel ist zwar nutzlos, zeigt Ihnen jedoch, wie einfach es ist, sich wiederholende Schritte zu erstellen.
Sie wissen jedoch nicht immer, wie oft ein bestimmter Schritt wiederholt werden soll. Es ist oft notwendig, einen Schritt oder eine Reihe von Schritten zu wiederholen, während eine bestimmte Bedingung erfüllt bleibt. In diesen Fällen verwenden wir einen Block "repeat while".
[applescript]
Setzen Sie theNumber auf 1
repeat while (theNumber < 2)
Anzeigedialog "Wieder abspielen?" Tasten {"Ja", "Nein"} Standardtaste 1
if result = {button returned:"Yes"} then
Anzeigedialog "Please insert more quarters!" buttons {"OK"} Standardtaste 1
else
Anzeigedialog "Goodbye!" Standardschaltfläche 2
setzen Sie theNumber auf (theNumber + 1)
end if
end repeat
[/applescript]
Hier haben wir den Dialog eingerichtet, der wiederholt wird, während theNumber kleiner als 2 ist. Wenn der Benutzer angibt, dass er erneut spielen möchte, erhält er eine Nachricht zum Einfügen weiterer Viertel und der Dialog wird wiederholt.
Solange der Benutzer Ja drückt, wird der Dialog wiederholt. Wenn der Benutzer "No" auswählt, fügen wir der Nummer eins hinzu und setzen den Wert auf zwei. Das Skript erkennt, dass die Wahrheitsanforderung falsch geworden ist, und hört auf, die Aktion zu wiederholen.
Alles zusammenfügen
Anstatt Ihnen einige Teile des nicht verbundenen Codes zu hinterlassen, dachte ich, es wäre am besten, ein letztes Beispiel zu geben, das alles integriert, was wir oben gelernt haben. Nehmen wir das obige Beispiel "pick a number" und konkretisiere es in ein voll funktionsfähiges Skript.
[applescript]
--Zufallszahl einstellen
Setzen Sie randomNumber auf eine Zufallszahl von 1 bis 10
--Boolean zum Testen, ob das Skript wiederholt werden soll
Setzen Sie repeatTest auf true
--Wenn das Ergebnis eine Zahl ist, wechseln Sie zu True und prüfen Sie, ob die Zahl zwischen 1 und 10 liegt
Setzen Sie testNumbers auf false
--Wenn das Ergebnis alle vorherigen Tests besteht, ist es korrekt?
Setzen Sie winningTest auf false
--Anzahl der Vermutungen
setze tryCount auf 0
--Generic Dialog Handler
auf dialogBox (theMessage)
Anzeigedialog theMessage
end dialogBox
--Wiederholen Sie diesen Vorgang, wenn Tests fehlgeschlagen sind
repeat while (repeatTest=true)
--Dialog anzeigen & Ergebnis abrufen
Anzeigedialog "Standardnummer 1-10 auswählen" Standardantwort "Nur Zahlen 1-10 eingeben" Standardschaltfläche 2
Setzen Sie theAnswer auf (vom Ergebnis zurückgegebener Text)
--Ist das Ergebnis eine Zahl?
try
Setzen Sie theAnswer auf theAnswer als Nummer
Setzen Sie testNumbers auf true
on error
dialogBox("Ungültige Eingabe")
end try
--Ist das Ergebnis zwischen 1 und 10?
if (testNumbers = true) then
- Test auf korrekte Zahlen
if theAnswer < 1 then
dialogBox("Ungültige Eingabe")
else if theAnswer < 11 then
Setzen Sie repeatTest auf false
Setzen Sie winningTest auf true
else
dialogBox("Ungültige Eingabe")
end if
end if
--Ist das Ergebnis die richtige Antwort?
if winningTest = true then
if theAnswer = randomNumber then
dialogBox("Du hast es in" & tryCount & "try!" erraten)
else
dialogBox("Versuchen Sie es erneut!")
Setzen Sie repeatTest auf true
Setzen Sie tryCount auf tryCount + 1
end if
end if
end repeat
[/applescript]
Auf den ersten Blick mag dieses Skript einschüchternd wirken. Wenn Sie jedoch alle obigen Beispiele durchgearbeitet haben, sollte alles vollkommen sinnvoll sein.
Schritt 1: Deklarieren Sie Ihre Variablen
Zuerst deklarieren wir unsere Variablen, die an dieser Stelle meist boolesch sind. Anschließend erstellen wir einen Handler (dialogBox), um unsere verschiedenen Dialoge im gesamten Skript anzuzeigen. Der Benutzer wird dann aufgefordert, eine Zahl zwischen 1 und 10 auszuwählen. Die Antwort wird dann durch drei separate Tests geführt.
Schritt 2: Überprüfen Sie den Eingang
Als nächstes testen wir, ob die Eingabe Buchstaben oder Symbole enthält. Dann testen wir, ob die vom Benutzer zurückgegebene Nummer im akzeptablen Bereich (1-10) liegt.
Schritt 3: Stimmt die Eingabe mit der Zufallszahl überein?
Schließlich testen wir, ob die Vermutung des Benutzers mit der vom Skript generierten Zufallszahl übereinstimmt.
Unter Verwendung von Booleschen Werten und if-Anweisungen ist das Skript so strukturiert, dass jeder aufeinanderfolgende Test nur ausgeführt wird, wenn die Eingabe den vorherigen Test besteht. Wenn ein Test false zurückgibt, beginnt der Wiederholungsblock erneut und die folgenden Aktionen werden nicht ausgeführt.
Nisten
Beachten Sie, dass es tatsächlich möglich ist, if-Anweisungen in if-Anweisungen zu verschachteln. Das gilt auch für Wiederholungsblöcke und Tellblöcke. Seien Sie jedoch vorsichtig, wenn Sie verschachtelte Anweisungen übermäßig verwenden. Ein oder zwei Schichten tief sind nicht schlecht, aber alles darüber hinaus wird nur chaotisch und schwer zu verfolgen.
Wenn Sie dieses Skript ausführen, sollten Sie eine Zahl auswählen und weiter raten, bis Sie es richtig verstanden haben. Spielen Sie ein paar Mal damit und sehen Sie, wie viele Vermutungen Sie brauchen, um es richtig zu machen!
Abschluss
Dieser Artikel hat Sie durch die Verwendung von if-Anweisungen, Booleschen Werten, Dialogfeldern, Benutzereingaben, Handlern, Fehlerbehandlern und Wiederholungsblöcken geführt.
Sie sollten jetzt in der Lage sein, einige wirklich ausgefallene Skripte zu erstellen, die die härtesten Workflows automatisieren. Setzen Sie einfach ein Lesezeichen auf diese Seite und verwenden Sie sie als Spickzettel für alle Ihre zukünftigen Skripte.
Wie oben erwähnt, ist dies der dritte Teil meiner Serie über Automatisierung. Ihr Feedback ist sehr wichtig für die Entscheidung, worüber ich schreibe. Lassen Sie mich wissen, ob ich sie weiterhin verwenden soll. Wenn die Nachfrage groß genug ist, schreibe ich gerne mehr!