Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在外部Applescript中获取自动机应用程序结果?_Applescript_Automator - Fatal编程技术网

在外部Applescript中获取自动机应用程序结果?

在外部Applescript中获取自动机应用程序结果?,applescript,automator,Applescript,Automator,有没有办法在外部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

有没有办法在外部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小程序可以进行通信的自然方式,尽管这并不意味着一种方式肯定不存在

同时,您可以实施一些变通方法/破解,尽管它们的方法有点不合时宜,但可以在不产生任何会影响小程序本身功能的副作用的情况下实现所需的结果

1.使用剪贴板 在小程序的工作流程结束时,或在希望报告其结果的操作之后,附加一个
复制到剪贴板
操作

从AppleScript检索剪贴板很简单:

get the clipboard
这可能适用于简单文本字符串或数字的返回值。将项目数组从自动机操作传递到剪贴板不是很可靠,有时只允许访问第一个项目。但是,这可以通过工作流中的小AppleScript来解决,以便正确处理结果数组并将其转换为可访问的格式,例如逗号分隔的字符串

但是,剪贴板还能够存储图像数据、文件引用和其他数据类型,因此可以(如果不是很简单的话)将这些数据发送到AppleScript中进行检索

在可能的情况下,字符串和数字是最安全的存储类型

2.写入临时文件 为了避免使用剪贴板作为中介,或者如果希望小程序报告多个变量而不需要做太多工作,则将数据写入临时文件是一种相当常见的做法,例如在shell脚本中,当同一脚本的多次执行之间需要持久值时

实际上,有一个特殊的目录可以获取,这样临时数据文件就不会累积:
/tmp
。它隐藏在Finder中,但您仍然可以像创建任何其他目录一样创建和删除文件。系统将清除3天内无法访问的文件

有一个
新文本文件
操作可以将文本写入文件:

指定
/tmp
目录最简单的方法是创建一个值为
“/tmp”
(不带引号)的变量,并将该变量拖到适当的字段中

但我倾向于在工作流中插入AppleScript,或者更合适的是,插入shell脚本,这样文件操作就变得更容易、更有效

日历事件示例 使用与您描述的场景类似的示例,检索日历事件的简单小程序可能具有如下工作流:

您可以在其中校准第一个操作以隔离所需的事件,例如今天的事件。该操作返回的对象类型不易被AppleScript处理,但第二个操作以文本格式提取相关数据,汇总第一个操作返回的事件列表

在这里,临时文件可用于将数据写入文本文件,然后可在AppleScript中检索文本文件

鉴于此自动程序小程序保存在命名的
“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
文件的最新内容

列表
变量
事件列表
中的每个项目都是一块如下所示的文本(星号是我的隐私修订,大括号中的地址项目也是如此):

将重要事件的详细信息(如名称和开始/结束时间)放置在AppleScript记录中:

{title:"GP Appointment", startTime:"15:45:00", EndTime:"16:00:00"}

完美的只有一个问题:我无法告诉Automator在/tmp目录中创建文本文件。创建变量时,Automator会询问我在何处创建变量,当然,标准Mac OS文件/文件夹对话框不会显示对/tmp目录的访问。我已通过添加图片来更新答案,以突出显示创建变量的位置和方式。Automator shuold询问您创建它的“位置”:您需要提供的唯一输入是变量的名称及其值。这不是一个自动操作;这是一个内置功能,可以通过Automator窗口底部的按钮访问(请参见新图片)。。。CalendarLib,不需要运行Calendar.app,可在以下位置获得:[.我还没有尝试过。这个链接不起作用,但我熟悉CalendarLib,我相信它是用Objective C使用
EventKit
框架编写的。我没有尝试CalendarLib本身,但我编写了自己的Objective C处理程序来管理日历事件,而不使用应用程序。我的问题是不知道什么类型的对象不可用hat Automator返回,因为我尝试的每个ObjC类都未能正确强制。我想在使CalendarLib成为自动机输出的可用接收器之前,我会解决同样的问题。但我会在某个时候尝试一下,让您知道。我意识到我不清楚,但我关心的不是Automator,而是检索今天的ev从Apple Calendar上下载ents,而不启动它,所以一个小而简单的库——可以添加到Applescript捆绑包中——会很好:)正确的链接是
    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|
{title:"GP Appointment", startTime:"15:45:00", EndTime:"16:00:00"}