【问题标题】:Apple Script: How to pass arguments between appsApple Script:如何在应用程序之间传递参数
【发布时间】:2021-11-15 06:16:28
【问题描述】:

我有 2 个 applescript 应用程序第一个实际上调用了第二个应用程序来运行。

应用 1

on open location this_URL
    tell application "App2" to activate
end open location

应用程序2

# does Something

现在我想将变量 this_URL 从应用程序 1 发送到应用程序 2,以便它可以处理它。 我是applescript的新手,我搜索了很多,但我得到的只是如何将命令发送到预构建的应用程序。我想知道如何发送变量以及如何在第二个应用程序中处理该变量?

编辑:

只是添加一个我现在正在做的示例方法,但我认为这不是最好的方法。

应用1:

on open location this_URL
    set the clipboard to this_URL
    tell application "App2" to activate
end open location

应用程序2:

set this_URL to ( the clipboard as text )

# does Something

set the clipboard to ""

【问题讨论】:

  • 我不太明白你的目标是什么?您想在其他应用程序中使用该变量吗?只需在那里使用this_URL。想要从应用程序中读取数据,将其保存为变量,然后在另一个应用程序中使用该变量?如果它是浏览器,您可以在其中执行 javascript(我认为您非常熟悉)在基于 Chrome/Chromium 的浏览器中使用 execute javascript "code goes here" 或在 safari 中使用 do javascript "code goes here"。不过,请务必使用 tell 语句定位正确的选项卡。我的意思是:请提供更多细节,在目前的状态下,我们无法提供帮助。
  • @gurkensaas 正是“想要从应用程序中读取,将其保存为变量,然后在另一个应用程序中使用该变量?”但我正在开发这两个应用程序。所以我只需要一种方法将这个变量传输到另一个应用程序并从那里处理它。
  • 您可能应该使用do shell script "osascript /path/to/your/applescript.app" 触发它们,然后看看它们返回什么。您也可以创建应用程序write to file 并使用read file ("/path/to/your/file.txt" as POSIX file) 从文件中读取。
  • @gurkensaas 我已经用我正在使用的示例方法/解决方法编辑了这个问题。它可以帮助你理解问题
  • @gurkensaas 有没有办法可以tell app2 do someting(this_url) end tell 并在我的app2 中处理这个something

标签: macos applescript ipc


【解决方案1】:

这是从 App1 应用程序控制 App2 的其他方法:

应用1:

my open_Location("https://www.google.gr")

on open_Location(this_URL)
    set App2 to load script (alias "HARD_DISK:Users:123:Desktop:App2.app:")
    displayURL(this_URL) of App2
end open_Location

App2(如您在上面看到的别名一样保存在桌面上):

on displayURL(theURL)
    activate
    display dialog theURL
end displayURL

注意:您也可以将 App2 参数分配给 on run handler。 (即,对 App2 的任何处理程序)。并且,您可以在 App1 中设置(获取应用程序“App2”的路径),而不是别名。

set App2 to load script (get path to application "App2")

【讨论】:

  • 这样,app2是单独运行还是在同一个进程中运行?
  • 它调用的处理程序(方法)在同一个进程中运行。 app2 本身根本没有启动。
  • 我认为这不适用于我的情况,因为 macOS 不允许使用 on open location 向终端发送事件。这就是我使用另一个应用程序与终端交互的原因。
【解决方案2】:

假设 App2 是一个脚本编辑器小程序,而不是 Xcode 应用程序,您可以直接调用它的处理程序。

应用 1:

on open location this_URL
    tell application "App2" to do_stuff(this_URL)
end open location

应用 2:

on do_stuff(this_URL)
    activate
    display dialog this_URL with title "App2"
end do_stuff

将 App2 保存为“应用程序”时,请确保选中“运行处理程序后保持打开”选项,否则它会在处理您的调用之前自动退出。

【讨论】:

  • 嗨,你测试过这个吗?因为我试图实现这一点,但没有奏效。日志:App2 已打开,但没有出现对话框。
  • 我的步骤:我将两个文件都保存为 txt。然后用osacompile 编译它们,还为app2 添加了-s 保持打开选项,从而使app1.appapp2.app。然后编辑 app1 的 plist 以处理 url。然后在 url 的帮助下执行 app1。
  • 在这里工作。我建议您尝试直接从脚本编辑器调用 app2 以确认它工作正常:tell application "app2" to do_stuff("TEST")。如果该部分有效,请向 app1 的 open location 处理程序添加一个临时的 display dialog 命令,以确认它正在正确处理 URL。
【解决方案3】:

我已将文本文件保存到 tmp 文件夹。您可以为其他变量使用多行或其他分隔符:

-- program 1
set myFilePath to "Macintosh HD:tmp:Variable.txt"
set wrongAnswer to "54"
set theAnswer to "42"
set myFile to open for access myFilePath with write permission
set eof of the myFile to 0
write wrongAnswer & return to myFile
write theAnswer to myFile
close access myFile


--program 2
set myFilePath to "Macintosh HD:tmp:Variable.txt"
set the_list to paragraphs of (read file myFilePath)
repeat with curRow in the_list
    display dialog curRow
end repeat

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2019-12-17
    相关资源
    最近更新 更多