转换为单行AppleScript

转换为单行AppleScript,applescript,line,applescript-objc,Applescript,Line,Applescript Objc,我有一系列的AppleScript命令需要在一行AppleScript中实现。代码如下 delay 2 tell application "System Events" to keystroke "foo" tell application "System Events" to keystroke return 通过将字符串连接在一起,可以将两个击键命令组合为一个: tell app "System Events" to keystroke "foo" & return 但这仍然给你

我有一系列的AppleScript命令需要在一行AppleScript中实现。代码如下

delay 2
tell application "System Events" to keystroke "foo"
tell application "System Events" to keystroke return
通过将字符串连接在一起,可以将两个击键命令组合为一个:

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
这很难看,因为从技术上讲,延迟不返回值,但我们可以将其与空字符串连接起来,而不会导致错误

问题是这样的建设不是很“通用”。您可能无法始终以相同的方式将任何命令转换为表达式(并且不能将tell之类的语句用作表达式1的一部分)。为了更加简洁(和模糊),您可以将最后一位写为
“foo”&return&(delay2)
。它仍然以相同的顺序运行(延迟优先),因为必须先计算串联表达式的每个部分,然后才能将其构建为击键命令的单个值

1缺少将它们放入给定的字符串中以运行脚本。即使如此,一些语句(循环、try/catch等)始终是多行的;不过,您可以通过使用转义换行符或串联以及一个换行常量(如下所示)来解决这个问题。

您可以使用带有字符串参数的运行脚本,并使用反斜杠2转义来表示换行符

run script "delay 0.1\ntell app \"System Events\" to keystroke \"foo\" & return"
AppleScript编辑器可以将转义符号转换为文字,除非在其编辑首选项(10.5及更高版本中提供)中启用了“转义制表符和换行字符串”。您可以始终使用返回常量和串联,而不是字符串中的文字/转义表示法

run script "delay 0.1" & return & "tell app \"System Events\" to keystroke \"foo\" & return"
2如果您要在目标C字符串文字中表示此类字符串(正如您的一条注释所暗示的),那么您将不得不转义目标C的反斜杠和双引号(…
&\\\\\\\\”系统
…)。

或者,如果您最终尝试使用osascript运行代码,那么您可以使用这样一个事实,即
-e
的每个实例都将成为一个单独的行,将其全部放在一个shell命令行中

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

出于好奇:为什么他们需要成为一行呢?另外:您能告诉我哪个应用程序收到“foo”和“return”吗?这将使测试脚本更容易。除此之外,我假设第二行和第三行可以连接到
告诉应用程序“系统事件”来击键{“foo”,返回}
。它必须是一行,因为我要将这个AppleScript实现到一个Cocoa应用程序中。那么你不能处理Cocoa中的延迟吗?我也不明白为什么需要一行。您可以在NSString文本中使用转义换行符
@“foo\nbar”
。您还可以在NSString文本中使用文本换行符。或者,如果不是文字,您应该仍然能够设法添加合适的换行符作为字符串生成的一部分。@Asmus@Chris Johnsen很好,我想我会处理Cocoa中的延迟。