在外部 Applescript 中获取 Automator 应用程序结果?
Get Automator app result in external Applescript?
有没有办法在外部 Applescript 应用程序(而不是 Automator 中的 Applescript 行)中检索 Automator 应用程序脚本的结果?
类似于:
tell application "My_Automator_App"
-- suppose My_Automator_App checks the Calendar to see if there some events today
-- "Show Result" in Automator will display a list
get the_Result -- list returned by Automator
end tell
我对此进行了一些调查,但没有找到一种自然的方式让 AppleScript 和 Automator applet 可以进行通信,尽管这并不意味着绝对不能存在。
与此同时,您可以实施几个 workarounds/hacks 中的一个,虽然它们的方法有点不合时宜,但确实可以达到预期的结果,而不会产生任何会影响小程序功能的副作用本身。
1。使用剪贴板
在小程序工作流程的末尾添加一个 Copy to Clipboard
操作,或者在您希望报告其结果的操作之后。
从 AppleScript 中检索剪贴板很简单:
get the clipboard
这可能适合作为简单文本字符串或数字的 return 值。将项目数组从 Automator 操作传递到剪贴板不是很可靠,有时只允许访问第一个项目。但是,这可以通过工作流中的小 AppleScript 来解决,以正确处理结果数组并将它们转换为可访问的格式,例如逗号分隔的字符串。
但是,剪贴板还能够存储图像数据、文件引用和其他数据类型,因此可以(如果不是总是直接的话)发送要在 AppleScript 中检索的数据。
在可能的情况下,字符串和数字是最安全的存储类型。
2。写入临时文件
为了避免使用剪贴板作为中介,或者如果您希望小程序报告多个变量而不需要太多工作,那么将数据写入临时文件是一种相当常见的做法,例如 shell 脚本,当同一脚本的多次执行之间需要持久值时。
实际上有一个特殊的目录可以获取 periodically purged,这样临时数据文件就不会堆积:/tmp
。它隐藏在 Finder 中,但您仍然可以像在任何其他目录中一样创建和删除文件。 3 天未访问的文件将被系统清除。
有一个可以将文本写入文件的New Text File
动作:
指定 /tmp
目录的最简单方法是创建一个值为 "/tmp"
(不带引号)的变量,然后将该变量拖到适当的字段中。
但我倾向于在工作流程中插入一个 AppleScript,或者更合适的是 shell 脚本,这样文件操作变得更加容易和更有能力。
日历事件示例
使用与您描述的场景类似的示例,检索日历事件的简单小程序可能具有如下所示的工作流程:
您可以在其中校准第一个动作以隔离您想要的事件,例如今天的事件。该操作 return 是一种不容易被 AppleScript 处理的对象,但第二个操作以文本格式提取相关数据,总结了第一个操作 returned 的事件列表。
这是一个临时文件,可用于将数据写入文本文件,然后可以在 AppleScript 中检索该文件。
鉴于此 Automator 小程序保存在名为 "CalEvents"
下,此 AppleScript 使用该小程序及其结果:
property tidEvents : [linefeed, linefeed, "EVENT", space] as text
property tidDetails : {tab, " to "}
property tid : a reference to my text item delimiters
run application id "com.apple.automator.CalEvents"
set tid's contents to tidEvents
set EventsSummary to read POSIX file "/tmp/EventsSummary.txt"
set EventsList to the EventsSummary's text items
set [[n], EventsList] to [it, rest] of EventsList
set n to n's last word as number
EventsList -- The final list of events from first to last
在它的第一个 运行 中,小程序需要同意才能访问您的日历信息,这只需要完成一次,并且会使上述脚本看起来失败。获得授权后,您可以根据需要随时 运行 脚本以获取 /tmp/EventsSummary.txt
文件的最新内容。
list
变量 EventsList
中的每个项目都是一个看起来像这样的文本块(星号是我为了保护隐私而进行的编辑,大括号中的地址项目也是如此):
4 OF 8
Summary: GP Appointment
Status: none
Date: 07/12/2017 to 07/12/2017
Time: 14:45:00 to 15:45:00
Location: ******** Medical Centre
{Address Line 1}
{Address Line 2}
{County}
{Post Code}
United Kingdom
Notes: 01*** *****9
每个值都用制表符与前面的冒号隔开,这在这里并不明显。此外,从日期格式和地址可以看出,这些是英国格式的值,但您的值当然会是 Calendar.[=28= 中设置的任何值]
但由于每个列表项都大同小异,因此在 AppleScript 中提取特定事件的详细信息会很简单,首先将特定事件项拆分为段落,然后通过制表符或 space 字符(或两者)或自然分隔有用文本位的介词:
set |Event| to some item in the EventsList
set tid's contents to tidDetails
set EventDetails to {title:text item 2 of paragraph 2 ¬
, startTime:text item 2 of paragraph 5 ¬
, EndTime:text item 3 of paragraph 5} of the |Event|
在 AppleScript 记录中放置重要的事件详细信息,例如其名称和 start/end 次:
{title:"GP Appointment", startTime:"15:45:00", EndTime:"16:00:00"}
有没有办法在外部 Applescript 应用程序(而不是 Automator 中的 Applescript 行)中检索 Automator 应用程序脚本的结果?
类似于:
tell application "My_Automator_App"
-- suppose My_Automator_App checks the Calendar to see if there some events today
-- "Show Result" in Automator will display a list
get the_Result -- list returned by Automator
end tell
我对此进行了一些调查,但没有找到一种自然的方式让 AppleScript 和 Automator applet 可以进行通信,尽管这并不意味着绝对不能存在。
与此同时,您可以实施几个 workarounds/hacks 中的一个,虽然它们的方法有点不合时宜,但确实可以达到预期的结果,而不会产生任何会影响小程序功能的副作用本身。
1。使用剪贴板
在小程序工作流程的末尾添加一个 Copy to Clipboard
操作,或者在您希望报告其结果的操作之后。
从 AppleScript 中检索剪贴板很简单:
get the clipboard
这可能适合作为简单文本字符串或数字的 return 值。将项目数组从 Automator 操作传递到剪贴板不是很可靠,有时只允许访问第一个项目。但是,这可以通过工作流中的小 AppleScript 来解决,以正确处理结果数组并将它们转换为可访问的格式,例如逗号分隔的字符串。
但是,剪贴板还能够存储图像数据、文件引用和其他数据类型,因此可以(如果不是总是直接的话)发送要在 AppleScript 中检索的数据。
在可能的情况下,字符串和数字是最安全的存储类型。
2。写入临时文件
为了避免使用剪贴板作为中介,或者如果您希望小程序报告多个变量而不需要太多工作,那么将数据写入临时文件是一种相当常见的做法,例如 shell 脚本,当同一脚本的多次执行之间需要持久值时。
实际上有一个特殊的目录可以获取 periodically purged,这样临时数据文件就不会堆积:/tmp
。它隐藏在 Finder 中,但您仍然可以像在任何其他目录中一样创建和删除文件。 3 天未访问的文件将被系统清除。
有一个可以将文本写入文件的New Text File
动作:
指定 /tmp
目录的最简单方法是创建一个值为 "/tmp"
(不带引号)的变量,然后将该变量拖到适当的字段中。
但我倾向于在工作流程中插入一个 AppleScript,或者更合适的是 shell 脚本,这样文件操作变得更加容易和更有能力。
日历事件示例
使用与您描述的场景类似的示例,检索日历事件的简单小程序可能具有如下所示的工作流程:
您可以在其中校准第一个动作以隔离您想要的事件,例如今天的事件。该操作 return 是一种不容易被 AppleScript 处理的对象,但第二个操作以文本格式提取相关数据,总结了第一个操作 returned 的事件列表。
这是一个临时文件,可用于将数据写入文本文件,然后可以在 AppleScript 中检索该文件。
鉴于此 Automator 小程序保存在名为 "CalEvents"
下,此 AppleScript 使用该小程序及其结果:
property tidEvents : [linefeed, linefeed, "EVENT", space] as text
property tidDetails : {tab, " to "}
property tid : a reference to my text item delimiters
run application id "com.apple.automator.CalEvents"
set tid's contents to tidEvents
set EventsSummary to read POSIX file "/tmp/EventsSummary.txt"
set EventsList to the EventsSummary's text items
set [[n], EventsList] to [it, rest] of EventsList
set n to n's last word as number
EventsList -- The final list of events from first to last
在它的第一个 运行 中,小程序需要同意才能访问您的日历信息,这只需要完成一次,并且会使上述脚本看起来失败。获得授权后,您可以根据需要随时 运行 脚本以获取 /tmp/EventsSummary.txt
文件的最新内容。
list
变量 EventsList
中的每个项目都是一个看起来像这样的文本块(星号是我为了保护隐私而进行的编辑,大括号中的地址项目也是如此):
4 OF 8 Summary: GP Appointment Status: none Date: 07/12/2017 to 07/12/2017 Time: 14:45:00 to 15:45:00 Location: ******** Medical Centre {Address Line 1} {Address Line 2} {County} {Post Code} United Kingdom Notes: 01*** *****9
每个值都用制表符与前面的冒号隔开,这在这里并不明显。此外,从日期格式和地址可以看出,这些是英国格式的值,但您的值当然会是 Calendar.[=28= 中设置的任何值]
但由于每个列表项都大同小异,因此在 AppleScript 中提取特定事件的详细信息会很简单,首先将特定事件项拆分为段落,然后通过制表符或 space 字符(或两者)或自然分隔有用文本位的介词:
set |Event| to some item in the EventsList
set tid's contents to tidDetails
set EventDetails to {title:text item 2 of paragraph 2 ¬
, startTime:text item 2 of paragraph 5 ¬
, EndTime:text item 3 of paragraph 5} of the |Event|
在 AppleScript 记录中放置重要的事件详细信息,例如其名称和 start/end 次:
{title:"GP Appointment", startTime:"15:45:00", EndTime:"16:00:00"}