(毫无疑问:)Automator 如何将 "invisible" 信息传输到 Script-Editor

(NO mystery:) How Automator transfers "invisible" information to Script-Editor

( 我被一位友好的会员推到对我的“神秘”的明显答案。
我自己没有找到这个解决方案感到有点惭愧,但如果周围没有太多恼怒的人,我会把这个帖子留在网上。也许其他人可以从中学习……向每个“无所不知”道歉!)

我用 Automator 记录了这些动作:

– Cmd-tab 将 TextEdit 置于最前面(必须输入一些行)
– 按左箭头 7 次 使用下移
– 停止录音

接下来,我选择并复制 (Cmd-c) Automator 的“记录我的操作”中的所有操作图标 window。
我切换到脚本编辑器并将它们粘贴 (Cmd-v) 到一个新的 window.

然后,我用3次UP箭头重复上面的记录,然后将图标复制到另一个新的window。
我只使用了两行“set uiScript to …”并将它们附加到第一个脚本中。
他们读的完全相同:

set uiScript to "keystroke \"\t\" using command down"
my doWithTimeout(uiScript)

set uiScript to "keystroke \"\" using shift down" -- 7 times left-arrow
my doWithTimeout(uiScript)

set uiScript to "keystroke \"\" using shift down" -- 3 times up-arrow
my doWithTimeout(uiScript)

on doWithTimeout(uiScript)
    set endDate to (current date)
    repeat
        try
            run script "tell application \"System Events\"\n" & uiScript & "\nend tell"
            exit repeat
        end try
    end repeat
end doWithTimeout    

(为了使生成的代码更具可读性,我省略了错误代码和“延迟”。)

现在,如果我禁用其中一个“击键”行(=> --my doWith…),脚本会以某种方式知道它必须执行 Shift-leftArrow 7 次 Shift-upArrow 3 次。
我在电脑重启后尝试了这个,甚至从这个网页复制代码并将其粘贴到一个新的脚本编辑器中window – 它仍然知道该怎么做!

怎么可能???

我唯一的想法是:即使 copied/pasted.
也必须有一些可以识别内容的内部 Applescript 数据库 有人知道吗?
只有当我以相同的方式重新编写代码时,才会发生 NOTHING – 直到我复制任一记录的第一行(“将 uiScript 设置为……”)。所以信息必须以某种方式链接到第一行。

(顺便说一句:前两行将 TextEdit – 或者,例如 Finder window – 带到前面,只能从打开的脚本编辑器中工作;您必须将 TextEdit 带到前面你自己,如果你从脚本编辑器的菜单图标子文件夹中启动另存为程序的脚本。然而,没有它们脚本将无法工作…)

由于答案很简单,但可能对某些人来说仍然很有趣,我将在稍后进行解释:

red_menace(在他上面的评论中)指出字符串可能包含不可见元素(如箭头键),因此我接下来检查了明显的:
如果您沿着“set uiScript …”字符串“光标移动”,光标实际上会在途中分别“暂停”7 或 3 个“步骤”。
我没有 thought/heard 任何“不可见的”字符串字符(除了 Word 等中明显的字符)。

它“知道”是因为击键在字符串中 - 使用控制类型键(例如箭头键)的击键没有文本表示,所以它们最终是不可见的。一些文本编辑器如 BBEdit 可以显示这些不可见的字符,但它们不会显示在脚本编辑器中。

Apple 显然已经使 Automator 的 Watch Me Do 动作能够在字符串中捕获其中一些控制键,但对于我们其他人来说,这要困难得多,因为控制键在按下时实际上会执行它们的功能.如果您需要使用这些键,可以使用 key code 命令,因为它指的是实际的键盘键,例如:

tell application "System Events"
   repeat 3 times
      key code 126 using shift down -- up arrow
   end repeat
end tell