我需要将一系列AppleScript命令实现到AppleScript的单行中。代码如下。
delay 2
tell application "System Events" to keystroke "foo"
tell application "System Events" to keystroke return
答案 0 :(得分:21)
您可以通过将字符串连接在一起将两个击键命令合并为一个命令:
tell app "System Events" to keystroke "foo" & return
但是这仍然留给你一个命令和一个声明(延迟和告诉......到...... )。
实际上,AppleScript的语句分隔符是换行符。在现代AppleScript中,换行符可以是CR,LF或CRLF(分别为:旧式Mac,Unix或DOS型)。编写多语句行没有方便的方法(比如C,Perl,Ruby等中的foo; bar; baz;
)。
对于您的特定请求,您可以使用 delay 作为表达式的一部分,以非常丑陋的方式将两者结合起来。
tell application "System Events" to keystroke "" & (delay 2) & "foo" & return
这很难看,因为 delay 在技术上没有返回任何值,但是我们能够将它与空字符串连接而不会导致错误。
问题是这种结构不是很“通用”。您可能无法始终以相同的方式将任何命令转换为表达式(并且您不能将 tell 之类的语句用作表达式 1 的一部分)。为了更简洁(和混淆),您可以将最后一位写为"foo" & return & (delay 2)
。它仍然以相同的顺序运行( delay 优先),因为必须先评估连接表达式的每个部分,然后才能将其构建到 keystroke 命令的单个值中。 / p>
<子> 1 没有把它们放在一个给运行脚本的字符串中。即使这样,一些语句(循环,try / catch等)总是多行的;虽然你可以通过使用转义换行符或连接和其中一个换行符常量来解决这个问题(如下所示)。 子>
您可以将 run script 与字符串参数一起使用,并使用反斜杠 2 转义来表示换行符。
run script "delay 0.1\ntell app \"System Events\" to keystroke \"foo\" & return"
AppleScript编辑器可以将转义符号转换为文字,除非您在其编辑首选项中启用了“在字符串中转义选项卡和换行符”(在10.5及更高版本中可用)。您始终可以使用 return 常量和连接而不是in-string-literal / escape-notation。
run script "delay 0.1" & return & "tell app \"System Events\" to keystroke \"foo\" & return"
<子>
2 如果你要在Objective C字符串文字中表示这样的字符串(正如你的一条评论所暗示的那样),那么你将不得不逃避Objective C的反斜杠和双引号(...) & \"tell app \\\"System
...)。
子>
或者,如果您最终尝试使用 osascript 运行代码,那么您可以使用-e
的每个实例将成为一个单独的行来将其全部放在单shell命令行。
osascript -e 'delay 2' -e 'tell app "System Events" to keystroke "foo" & return'