概念上:
-
run 命令启动并运行应用程序隐藏
-
activate 命令启动、运行并激活应用程序(使其成为最前面的应用程序)
-
launch, according to Apple, "启动应用程序,如果它尚未运行,但不发送运行命令。"
- 对于基于 AppleScript 的应用程序,这应该意味着它们已加载,但未执行(即,它们的 - 隐式或显式 -
on run 处理程序未被调用),但在实践中,直到 10.9 - 见下文。
- 不清楚(对我而言)这对于基于 非-AppleScript 的应用程序究竟意味着什么
脚本可以向脚本应用程序发送命令,就像它可以向其他应用程序发送命令一样。要启动非保持打开的应用程序并运行其脚本,请使用启动命令后跟运行命令,如下所示:
launch application "NonStayOpen"
run application "NonStayOpen"
启动命令启动脚本应用程序,而不向其发送隐式运行命令。当运行命令被发送到脚本应用程序时,它会处理该命令,必要时发回回复,然后退出。
在 OSX 10.8、10.9 上出现问题(在 OSX 10.10 中已修复):
launch 本身足以运行应用程序,并且确实是唯一适用于基于 AppleScript 的应用程序的命令。
任何执行 run 或 activate 的尝试(无论是否除了 launch)都会运行应用程序 - 从 AppleScript 编辑器运行时甚至 两次(!;只使用一次 osascript) - 但报告失败<appName> got an error: Connection is invalid。
这让我觉得 错误。
不确定 OSX 版本
注意:我曾经目睹过 launch 的非执行行为,但是我在 OS X 10.9.2 和 OS X 10.8.5 上从头开始创建的每个非保持打开的基于 AppleScript 的测试应用程序还执行带有launch 的脚本 - 与文档所说的相矛盾。
如果您的系统表现不同和/或旧版本的表现如何,请告诉我。没有使用launch 创建的应用程序是在哪个 OSX 版本上创建的?
在 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 简单地使用
launch 命令(尽管这对 OP 不起作用,可能是因为在
launch application ":path:to:applescript:apps:shell-script-launcher.app"
但是,出于两个原因,不建议这样做:
- 在 OSX 10.10 中,Apple 已将
launch 行为修复为不再执行,因此您的代码在此处运行时会中断。
- 虽然非 AppleScript 应用程序在使用
launch 调用时通常会运行(隐藏),但 documentation says AppleScript“不会向其发送运行命令”并且“允许您打开应用程序而不执行其通常的启动过程,例如打开一个新窗口”——具体含义尚不清楚,不同的应用程序似乎处理方式不同。