20 Stimmen

Umwandlung in einzeiliges AppleScript

Ich habe eine Reihe von AppleScript-Befehlen, die ich in einer einzigen AppleScript-Zeile implementieren muss. Der Code ist unten.

delay 2
tell application "System Events" to keystroke "foo"
tell application "System Events" to keystroke return

29voto

Chris Johnsen Punkte 199970

Sie können die beiden Tastenanschlag Befehle zu einem einzigen zusammenfassen, indem Sie Ihre Zeichenketten miteinander verketten:

tell app "System Events" to keystroke "foo" & return

Damit bleiben aber immer noch ein Befehl und eine Anweisung ( Verzögerung y sagen Sie zu ).

Der Anweisungstrenner von AppleScript ist ein Zeilenumbruch. In modernem AppleScript können die Zeilenumbrüche entweder CR, LF oder CRLF sein (bzw.: Old-Mac-, Unix- oder DOS-Stil). Es gibt keine bequeme Möglichkeit, eine Zeile mit mehreren Anweisungen zu schreiben (wie foo; bar; baz; in C, Perl, Ruby und so weiter).

Für Ihr spezielles Anliegen können Sie die beiden auf wirklich hässliche Weise kombinieren, indem Sie Verzögerung als Teil eines Ausdrucks.

tell application "System Events" to keystroke "" & (delay 2) & "foo" & return

Dies ist hässlich, weil Verzögerung gibt technisch gesehen keinen Wert zurück, aber wir sind in der Lage, ihn mit einer leeren Zeichenkette zu verketten, ohne einen Fehler zu verursachen.

Das Problem ist, dass eine solche Konstruktion nicht sehr "allgemein" ist. Sie können nicht immer jeden Befehl auf die gleiche Weise in einen Ausdruck verwandeln (und Sie können keine Anweisungen wie sagen als Teil eines Ausdrucks 1 ). Der Einfachheit halber (und zur Verschleierung) können Sie das letzte Stück wie folgt schreiben "foo" & return & (delay 2) . Es läuft immer noch in der gleichen Reihenfolge ( Verzögerung zuerst), da jeder Teil des Verkettungsausdrucks ausgewertet werden muss, bevor er zu einem einzigen Wert für die Tastenanschlag Befehl.

<sup>1 </sup>Es reicht nicht aus, sie in eine Zeichenkette einzufügen, die an <em>Skript ausführen </em>Das heißt. Selbst dann sind einige Anweisungen (Schleifen, try/catch usw.) immer mehrzeilig; allerdings kann man das umgehen, indem man escapete Zeilenumbrüche oder Verkettung und eine der Zeilenumbruchskonstanten (wie folgt) verwendet.

Sie könnten verwenden Skript ausführen mit einem String-Argument und verwenden Sie den Backslash 2 Escapes, um die Zeilenumbrüche darzustellen.

run script "delay 0.1\ntell app \"System Events\" to keystroke \"foo\" & return"

AppleScript-Editor kann die Escape-Notation in ein Literal übersetzen, es sei denn, Sie haben in den Bearbeitungseinstellungen die Option "Tabulatoren und Zeilenumbrüche in Zeichenketten ausblenden" aktiviert (verfügbar ab 10.5). Sie können immer die return Konstante und Verkettung anstelle der In-String-Literal/Escape-Notation.

run script "delay 0.1" & return & "tell app \"System Events\" to keystroke \"foo\" & return"

<sup>2 </sup>Wenn Sie solche Zeichenketten in einem Objective C-Stringliteral darstellen wollen (wie einer Ihrer Kommentare vermuten lässt), dann müssen Sie die Backslashes und doppelten Anführungszeichen auch für Objective C escapen ( ) <code>& \"tell app \\"System</code> ).

Oder, wenn Sie versuchen, den Code mit osascript dann können Sie die Tatsache nutzen, dass jede Instanz von -e wird zu einer separaten Zeile, um alles in einer einzigen Shell-Befehlszeile unterzubringen.

osascript -e 'delay 2' -e 'tell app "System Events" to keystroke "foo" & return'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X