代码之家  ›  专栏  ›  技术社区  ›  Herms

我可以将共享的applescript代码放在单独的文件中,并将其加载到不同的脚本中吗?

  •  1
  • Herms  · 技术社区  · 16 年前

    我开始使用AppleScript,并准备编写一些用于管理Windows的脚本。他们所需要的一个共同任务是获得当前的屏幕大小。

    我已经创建了一个屏幕大小的子程序,似乎可以工作,我想能够与我的所有脚本共享它。但是,我无法找到一种方法将它放在单独的文件中,我可以在其他脚本中加载该文件。我尝试创建一个单独的screen\u size.scpt文件并使用 load script "screen_size.scpt" 但我得到了一个关于“can't make”screen-size.scpt“into a type file”的错误。

    必须要有一种方法才能做到这一点,但我还没有在网上找到任何关于如何做到这一点的信息。

    编辑:

    建议的posix内容对我不起作用。我可以创建文件对象,但它拒绝转换为别名,说它找不到文件(看起来POSIX文件保持相对而不是完全展开)。

    我在网上找到了使用finder的建议,并通过以下工作获得了别名:

    tell application "Finder"
      set _myPath to container of (path to me) as text
    end tell
    
    set _loadPath to (_myPath & "screen_size.scpt")
    set _loadAlias to alias _loadPath
    

    但是,下一行由于语法错误而失败,声称LoadAlias不是变量:

    property _ScreenSize : load script _loadAlias
    

    我尝试过的每一个变量(在加载调用中执行别名等)都失败了,总是声称变量不存在,即使我知道它正在被设置并尽我所能地工作。发生什么事?为什么它声称一个变量不存在,而它显然存在?

    6 回复  |  直到 12 年前
        1
  •  2
  •   Herms    16 年前

    AppleScript在保存时做了一些非常奇怪的事情,我还没弄清楚到底发生了什么,但最终我得到了一些有用的东西。

    以下是我的资料:

    on load_script(_scriptName)
      tell application "Finder"
        set _myPath to container of (path to me) as text
      end tell
    
      set _loadPath to (_myPath & _scriptName)
      load script (alias _loadPath)
    end load_script
    
    set _ScreenSize to load_script("screen_size.scpt")
    
    set _bounds to _ScreenSize's screen_size()
    -- ...
    

    其他的答案是将屏幕大小设置为属性,但这会导致语法错误,从而阻止我保存文件。当我做的时候只是用 set 它奏效了。

    我从来没能得到建议工作的posix路径,但是为路径戳finder工作得很好。

        2
  •  1
  •   Ulve    16 年前

    是的,有一种方法可以做到这一点。将文件加载到属性中并以这种方式访问它

    property _ScreenSize : load script (alias "pathtoscript")
    
    _ScreenSize's doStuff()
    

    对于相对路径,请尝试以下操作:

    set p to "./screen_size.scpt" 
    set a to POSIX file p 
    

    所以这可能会奏效:

    set p to "./screen_size.scpt" 
    set a to POSIX file p 
    
    property _ScreenSize : load script (alias a)
    
    _ScreenSize's doStuff()
    
        3
  •  1
  •   Isaiah    13 年前

    为了从另一个脚本执行一个操作,您必须在要加载的脚本中创建一个处理程序(在您的答案中,您已经用“screen_size()”完成了这个操作)。

    在您的情况下,此脚本将是“screen\u size.scpt”。 所以“screen\u size.scpt”必须看起来像这样:

    on screen_size()
           --your actions
    return [yourvalue] --the value you want to pass to the other script
    end screen_size()
    

    要从中加载的脚本必须如下所示:

    tell application "Finder"
        set _myPath to (container of (path to me) as text & "screen_size.scpt") as alias
    end tell
    set _ScreenSizeScript to load script _myPath
    
    set _bounds to _ScreenSizeScript's screen_size()
    

    如果它不起作用,或者你不完全理解我,可以问一下(:

        4
  •  1
  •   Zitoun    13 年前

    我每天都有人在使用我的库,所以在调用它之前,我首先要确保库在这里。 假设我有一个库“lib.excel.app”(用satimage的微笑保存为不可编辑的应用程序)。 在使用它的脚本的开头,我使用以下代码“加载”库:

    set commonCodeFile to (path to library folder as string) & "Scripts:CommonLibraries:Lib.Excel.app"
    
    tell application "Finder"
        if not (exists (file commonCodeFile)) then error ("\"Lib.Excel\"
    " & "
    should be found in folder
    " & "
    scroll > CommonLibraries")
    end tell
    
    global cc -- make it short and easy to write :)
    set cc to load script alias ccFile
    

    然后当我必须使用lib中的函数时,我就这样调用它:

    set {what, a} to cc's veryNiceFunction()
    
        5
  •  0
  •   ExitToShell    16 年前

    是的,你可以。但是,您需要脚本的完整路径。

    我相信您仍然可以使用“我的路径”来获取执行当前脚本的应用程序的路径,然后您可以修改该路径以指向包含脚本的子文件夹。

    几年前,我用这种技术绕过了Applescripts(以前的)32K的文本大小限制,为一些真正大型/复杂的IRC脚本编写代码。

    我想我的G4中仍然有所有的旧脚本,在我办公室的办公桌下面。不幸的是,它在一个ENE开关后面,我不能VNC进入它,否则我会有大量的示例代码要发布。

        6
  •  0
  •   craig    12 年前

    您可以在变量中加载脚本,但必须先声明它。

    property _ScreenSize : missing value
    
    tell application "Finder" to set _myPath to container of (path to me) as text
    
    set _loadPath to (_myPath & "screen_size.scpt")
    
    set _loadAlias to alias _loadPath
    
    set _ScreenSize to (load script _loadAlias)