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

Rya*_*yan 9 macos shell applescript

这是我的文件:

launcher.applescript

tell application ":path:to:applescript:apps:shell-script-launcher.app" to launch
Run Code Online (Sandbox Code Playgroud)

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

 do shell script "say starting script"
Run Code Online (Sandbox Code Playgroud)

期望的行为:

  1. 从AppleScript编辑器运行"launcher.applescript"
  2. 听"开始剧本"

实际行为:

  1. 通过在finder中手动打开它来运行"shell-script-launcher.app"会产生预期的行为
  2. 运行"launcher.applescript"会打开"shell-script-launcher.app",但它永远不会执行shell脚本.

我已经尝试将应用程序保存为"仅运行"以及"保持打开".仍然没有进展.您有什么推荐的吗.最终结果必须是应用程序而不是Applescript.

mkl*_*nt0 16

从概念上讲:

  • run命令启动并运行隐藏的应用程序
  • activate命令启动,运行和激活应用程序(使其成为最前面的应用程序)
  • launch,根据苹果 "启动一个应用程序,如果是尚未运行,但不发送运行命令."
    • 对于基于AppleScript的应用程序,这应该意味着它们已被加载未被执行(即,它们 - 隐式或显式 - on run处理程序未被调用),但实际上在10.9之前并非如此 - 见下文.
    • 我不清楚(对我来说)对于基于Apple的应用程序究竟意味着什么

以下是Apple 认为它适用于基于AppleScript的应用程序的方式,这仅适用于OSX 10.10(Yosemite):

脚本可以将命令发送到脚本应用程序,就像它可以发送到其他应用程序一样.要启动非逗留打开的应用程序并运行其脚本,请使用启动命令,然后运行run命令,如下所示:

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.

这让我感到害怕.
不确定OSX版本<= 10.7的行为.

注意:我已经见过launch一次非执行行为,但是我在OS X 10.9.2和OS X 10.8.5上从头开始创建的每个非停留打开的基于AppleScript的测试应用程序也执行脚本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"
Run Code Online (Sandbox Code Playgroud)
  • 如果你知道你正在调用的应用程序类型:

    • 运行基于AppleScript的应用程序:最好使用run script file,正如@ regulus6633建议的那样 - 这具有额外的优势,即调用的基于AppleScript的应用程序可以直接将对象返回给调用者:
run script file ":path:to:applescript:apps:shell-script-launcher.app"
Run Code Online (Sandbox Code Playgroud)

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

  • 运行非AppleScript应用程序:使用run/ activate运行隐藏/最前端的应用程序:
run application ":path:to:applescript:apps:shell-script-launcher.app"
Run Code Online (Sandbox Code Playgroud)
  • 你可以使用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
Run Code Online (Sandbox Code Playgroud)
  • 最后,在OSX <= 10.9上,您可以尝试简单地使用该launch命令(虽然这对OP不起作用,可能是由于处理<= 10.7 OSX版本):
 launch application ":path:to:applescript:apps:shell-script-launcher.app"
Run Code Online (Sandbox Code Playgroud)

但是,出于以下两个原因,这是不可取的:

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