Преобразование в одну строку AppleScript - PullRequest
12 голосов
/ 13 марта 2011

У меня есть серия команд AppleScript, которые мне нужно внедрить в одну строку AppleScript.Код ниже.

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

1 Ответ

22 голосов
/ 13 марта 2011

Вы можете объединить две команды нажатие клавиши в одну команду путем объединения строк:

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

Но это все равно оставляет одну команду и оператор (задержка и скажите… до… ).

По сути, разделитель операторов AppleScript представляет собой разрыв строки.В современном AppleScript разрывы строк могут быть CR, LF или CRLF (соответственно: старый-Mac-, Unix- или DOS-стиль).Не существует удобного способа написать строку с несколькими утверждениями (например, foo; bar; baz; в C, Perl, Ruby и т. Д.).

Для вашего конкретного запроса вы можете объединить их в действительно ужасном виде, используя задержка как часть выражения.

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

Это ужасно, потому что задержка технически не возвращает значения, но мы можем объединить его с пустой строкойбез возникновения ошибки.

Проблема в том, что такая конструкция не очень «общего назначения».Возможно, вы не всегда сможете превратить любую команду в выражение одним и тем же способом (и вы не можете использовать такие выражения, как tell как часть выражения 1 ).Для большей краткости (и запутывания) вы можете записать последний бит как "foo" & return & (delay 2).Он по-прежнему выполняется в том же порядке (сначала задержка ), поскольку каждая часть выражения конкатенации должна быть оценена, прежде чем ее можно будет встроить в одно значение для команды нажатие клавиши .

1 Если не считать их в строке, заданной run script , то есть.Даже тогда некоторые операторы (циклы, try / catch и т. Д.) Всегда многострочные;хотя вы можете обойти это, используя экранированные разрывы строк или конкатенацию и одну из констант разрывов строк (как показано ниже).

Вы можете использовать run script со строковым аргументом и использовать обратную косую черту 2 для представления разрывов строк.

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

Редактор AppleScript может преобразовать escape-нотацию в литерал, если в настройках редактирования («10» и более поздние версии не включены «Вкладки Escape и разрыв строки в строке»).Вы всегда можете использовать константу return и конкатенацию вместо буквенно-буквенного / escape-обозначения.

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

2 Если выесли вы будете представлять такие строки внутри строкового литерала Objective C (как может означать один из ваших комментариев), то вам также придется избегать обратной косой черты и двойных кавычек для Objective C (… & \"tell app \\\"System…).

Или, если вы в конечном итоге пытаетесь запустить код с osascript , то вы можете использовать тот факт, что каждый экземпляр -e станет отдельной строкой, чтобы поместить еговсе в одной командной строке оболочки.

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