相对于当前脚本的位置动态加载AppleScripts

时间:2014-06-20 03:54:17

标签: applescript

我希望能够引用与控制器位于同一目录中的模型文件。

最初,它们位于项目的根文件夹中,但是当它们被编译时(使用osacompile),它们都将位于Controller.scptd/Contents/Resources/Scripts目录中。

Controller.applescript:

property path :  (container of (path to me) as text) <-- Error: Can’t make container of alias "Macintosh HD:Users:craig:Projects:AppleScript:Foobar:Controller.applescript" into type text.
property model : load script file (path & "Model.scpt")

我无法正确使用语法;我一直无法找到可行的解决方案。有没有办法让这个工作?

**编辑**

如@ dj-bazzie-wazzie和@ mklement0所述,应用程序包上下文中的path to me引用脚本包(在我的示例中为Controller.scptd),而不是脚本本身( Controller.scptd/Contents/Resources/Scripts/main.scpt)。

假设Model.scpt已与main.scpt目录中的/Contents/Resources/Scripts捆绑在一起,则此语法有效:

set Model to load script (path to resource "Model.scpt" in directory "Scripts")

不幸的是,它不适用于非捆绑脚本;然而,@ Michele-Percich的解决方案将起作用。

是否有一种语法适用于这两种情况?

3 个答案:

答案 0 :(得分:4)

在编译时初始化(设置)属性,它们的值是持久的。因此,即使您有动态值,脚本也只会在最后一次编译脚本时保留命令/类的值。这是一个属性如何工作的例子:

property a : current date
return a

您可以继续单击AppleScript-Editor中的运行按钮,但您会看到日期未更新。这是因为当脚本编译时,编译器注意到current date并使用其值。它不是存储在属性中的current date的引用,而是current date在编译时返回的值,它只是一个日期值。

每次启动脚本时都需要加载脚本。

property model : missing value
set model to load script file ((path to me as string) & "Contents:Resources:Scripts:Model.scpt")

编辑:在问题更新后更新我的答案

如果你想在库捆绑包内外使用库,我会看一下脚本库,如果你正在运行Mavericks。当您使用use语句加载脚本库并且正在运行的脚本是一个包(保存为应用程序或脚本包)时,它将首先尝试从那里加载库。如果失败或脚本只是一个文件而不是一个包,它将从4个库文件夹(用户,计算机,网络,系统库和按此顺序)加载脚本库。

我写了a tutorial about how to write script libraries

答案 1 :(得分:3)

container是Finder的元素。 另外,你为什么要使用属性?

无论如何,这应该有效:

tell application "Finder"
   set myPath to container of (path to me) as text
end tell
set model to load script file (myPath & "Model.scpt")

答案 2 :(得分:3)

要解决以后添加的要求代码应该在以下情况:

  • 以简单的*.scpt 文件运行时:从相同的文件夹(作为正在运行的脚本本身)加载其他脚本
  • *.scptd 捆绑包运行时:从捆绑包加载另一个脚本(技术上,与捆绑包内的主脚本相同的文件夹)。< / LI>

此解决方案基于@Michele Percich@dj bazzie wazzie提供的有用答案; @dj bazzie wazzie's great tutorial on script libraries非常值得一读。

set otherScript to "Model.scpt"
if (path to me as string) ends with ":" then # Running as bundle?
    set otherScript to ¬
        (path to resource otherScript in directory "Scripts") as string
else
    tell application "Finder" to set otherScript to ¬
        (container of (path to me) as string) & otherScript
end if

set model to load script file otherScript
path to me as string结尾的

:表示该路径是文件夹。由于path to me在作为脚本捆绑包运行时返回捆绑文件夹(基于AppleScript的*.app捆绑包执行相同操作),我们可以推断出正在运行的代码是捆绑包的一部分