如何启动AppleScript应用程序并从另一个AppleScript运行shell脚本?

时间:2014-03-27 16:23:42

标签: macos shell applescript

以下是我的文件:

launcher.applescript

tell application ":path:to:applescript:apps:shell-script-launcher.app" to launch

shell-script-launcher.app [AppleScript,保存为应用程序]

 do shell script "say starting script"

期望的行为:

  1. 运行" launcher.applescript"来自AppleScript编辑器
  2. 听取"启动脚本"
  3. 实际行为:

    1. 运行" shell-script-launcher.app"通过在finder中手动打开它产生预期的行为
    2. 运行" launcher.applescript"打开" shell-script-launcher.app"但它永远不会执行shell脚本。
    3. 我已尝试将应用保存为"仅限运行"以及"保持开放"。仍然没有进展。您有什么推荐的吗。最终结果必须是应用程序而不是Applescript。

7 个答案:

答案 0 :(得分:16)

概念

  • run命令启动并运行应用程序隐藏
  • activate命令启动,运行,激活应用程序(使其成为最前面的应用程序)
  • launchaccording to Apple,“启动应用程序,如果它尚未运行,但不发送运行命令。”
    • 对于基于AppleScript的应用程序,此 应意味着已加载,但未执行(即,他们的 - 隐式或显式 - on run处理程序未被调用),但实际上在10.9之前是不正确的 - 见下文。
    • 目前还不清楚(对我来说) - 基于AppleScript的应用程序究竟意味着什么

以下是Apple thinks it works with AppleScript-based applications,其中仅从OSX 10.10(优胜美地)开始才真正

  

脚本可以向其他应用程序发送命令到脚本应用程序。要启动非停留打开的应用程序并运行其脚本,请使用启动命令,然后运行命令,如下所示:

     

launch application "NonStayOpen"
  run application "NonStayOpen"

     

launch命令启动脚本应用程序而不向其发送隐式运行命令。当run命令发送到脚本应用程序时,它会处理命令,必要时发回一个回复,然后退出。

OSX 10.8,10.9上的损坏行为(在OSX 10.10中已修复):

launch 本身足以运行应用程序,并且确实是唯一适用于基于AppleScript的应用程序的命令 。 任何尝试执行runactivate(无论是否launch除外)都会运行应用程序 - 甚至两次从AppleScript编辑器运行时(!;只是一次使用osascript) - 但报告失败<appName> got an error: Connection is invalid

这让我觉得 bug 不确定OSX版本&lt; = 10.7的表现如何。

注意:我已经见过launch一次的非执行行为,但是我在OS X 10.9.2和OS X 10.8上从头开始创建的每个非停留打开的基于AppleScript的测试应用程序.5还使用launch执行脚本 - 与文档说的相矛盾。

如果您的系统行为不同和/或旧版本的行为方式,请告知我们。在什么OSX版本中,应用程序无法使用launch创建?

OSX 10.10 上,行为与文档一致,有一点值得注意:

  • 如果目的是一步启动并运行,run application就足够了 - 首先不需要单独的launch application命令。

选项


  • @ user309603的实用解决方案只需使用带标准do shell script实用程序的 open来绕过问题 - 这应该可行,无论是否应用程序是基于AppleScript还是不是:
do shell script "open " & ¬
    quoted form of POSIX path of ¬
    alias ":path:to:applescript:apps:shell-script-launcher.app"

  • 如果您知道应用程序的类型,您需要预先调用:

    • 运行基于AppleScript的应用:最好使用run script file,正如@ regulus6633建议的那样 - 这样做的另一个好处是,调用的基于AppleScript的应用程序可以直接将对象返回给呼叫者:
run script file ":path:to:applescript:apps:shell-script-launcher.app"

注意:还有load script file,它确实只允许你加载脚本代码而不立即执行它。

  • 运行非AppleScript 应用:使用run / activate运行应用程序隐藏/最前端:
run application ":path:to:applescript:apps:shell-script-launcher.app"

  • 您可以使用run ,即使是基于AppleScript的应用程序,只需忽略错误try ... end try,正如@atonus所暗示的那样 - 缺点是您将无法检测到实际调用应用程序的失败。

您可以通过有选择地忽略特定的Connection invalid错误(假定此错误不会合法发生)[OSX 10.10不再需要]来缓解此问题:

try
    run application "Macintosh HD:Applications:_Sandbox-AppleScript0.app"
on error number -609 # 'Connection is invalid' error that is spuriously reported
    # simply ignore
end try

  • 最后,在OSX&lt; = 10.9上,您可以尝试简单地使用launch命令(虽然这对OP不起作用,可能是由于处理&lt; ; = 10.7 OSX版本):
 launch application ":path:to:applescript:apps:shell-script-launcher.app"

但是,不可取有两个原因:

  • 在OSX 10.10中,Apple已将launch行为修复为不再执行,因此您的代码在运行时会中断。
  • 虽然非AppleScript应用程序通常在使用launch调用时运行(隐藏),但AppleScript“documentation says不向其发送运行命令”和“允许您打开应用程序而不执行它通常的启动程序,例如打开一个新窗口“ - 这究竟意味着什么并不清楚,不同的应用程序似乎处理不同。

答案 1 :(得分:4)

Applescript有“运行脚本”命令。它适用于applescripts或applescript应用程序。因此,如果我的桌面上有您的应用程序,那么这可以...

set appPath to (path to desktop as text) & "shell-script-launcher.app"
run script file appPath

答案 2 :(得分:4)

您是否尝试过open

do shell script "open 'path/to/applescript/apps/shell-script-launcher.app' && say starting script"

答案 3 :(得分:1)

将其放在“try”关键字之间。

try
tell application ":path:to:applescript:apps:shell-script-launcher.app" to activate
end try

答案 4 :(得分:1)

这很简单,您只需使用普通do shell script,例如:

do shell script "open " & ¬
    quoted form of POSIX path of ¬
    alias ":path:to:applescript:apps:shell-script-launcher.app"

答案 5 :(得分:1)

将脚本另存为应用程序。 将所需的脚本添加到Script文件夹中(参见下面的路径)

按如下方式运行,更改您要运行的每种类型的脚本...

property theApplicationPath : the path to me as text <br/>
property theShellScriptPath : theApplicationPath & "Contents:Resources:Scripts:test.command"<br/>
property theShellScript : the quoted form of POSIX path of theShellScriptPath<br/>
<br/>
tell application "Terminal" to (do shell script "/bin/bash " & theShellScript)
<br/>
热潮,鲍勃是你的叔叔!至少对我而言。

答案 6 :(得分:0)

这可能会有所帮助,但我不是这方面的专家。在这种情况下,我发现双重启动行为(在Yosemite上,我没有使用任何其他版本的OS X)非常讨厌和挖掘我发现可以检查它是否已经在运行。

这个脚本是我可以随时启动一个新的终端。

if application "Terminal" is running then
    tell application "Terminal"
        activate
        do script ""
    end tell
else
    tell application "Terminal" to activate
end if