osacompile更改AppleScript输出,使其无法运行

时间:2012-01-12 13:01:36

标签: applescript

我有一个半长的AppleScript,我每天早上都会运行以启动我的所有应用程序等。它所做的一件事就是启动一些应用程序,然后立即将它们最小化。当我将.applescript源粘贴到脚本编辑器并运行它时,一切正常:

-- snip:
tell application "Mail"
    launch
    minimize(window 1) of me
    check for new mail
end tell
-- 'minimize' defined as:
on minimize(w)
    set the miniaturized of w to true
end minimize

但是当我按如下方式编译AppleScript源时:

osacompile -o ~/Library/Scripts/myscript.scpt myscript.applescript

......编译器将minimize称为:

on minimize(w)
    set |miniaturized| of w to true
end minimize

我收到了这个错误:

  

错误“邮件出错:无法将窗口ID 30936的|微型化|变为类型引用。”数字-1700来自| smallaturized |窗口ID 30936的引用

任何人都知道我在这里做错了什么?出于版本控制的目的,我需要通过osacompile运行脚本。

更新:为了澄清,似乎正在发生的事情是脚本编辑器在命令行上编译方法的方式与osacompile不同。是否知道它们是否编译不同(例如,使用范围推断或某些此类事物)?

2 个答案:

答案 0 :(得分:1)

您的代码没有任何问题 - 我怀疑这是osacompile 中的错误,我建议您提交bug report with Apple - 我已经完成了。

您可以使用AppleScript Editor将其直接保存为*.scpt文件,然后使用osascript运行,以验证您的代码是否正常运行。 [更新]相比之下,将*.applescript源代码文件直接传递给osascript确实会出现问题。

我没有充分理由认为基于AppleScript Editor的编译工作方式与osacompile(以及osascript中的按需编译)不同,前者'在这种情况下,行为是预期的和期望的行为。

有2个变通办法

  • miniaturized中附加对using terms from application "System Events"的引用: 这是一个通用的解决方法,可以与任何AppleScriptable应用程序中的窗口一起使用。

    on minimize(w)
        using terms from application "System Events" # WORKAROUND
             set miniaturized of w to true
        end using terms from
    end minimize
    
  • 内联小型化命令而不是调用子程序

    set miniaturized of window 1 to true
    

答案 1 :(得分:0)

on minimize(w)
    set the miniaturized of w to true
end minimize

这不正确。你在任何应用程序告诉代码块之外“小型化”,这意味着它是一个applescript命令。这不是一个AppleScript命令。它是Mail和其他应用程序的命令。令人惊讶的是它在AppleScript编辑器中正常工作。它真的不应该。当你有一个没有意义的命令时,applescript足以让它理解它,有时它可以克服你的编码错误。显然,osacompile无法克服你的编码错误。

因此修复osacompile问题的方法是消除编码错误。您需要在应用程序内部使用小型化命令告诉代码块。

要查看我的意思打开“标准添加”applescript字典并尝试查找小型化命令。你找不到它。现在打开Mail的applescript字典,你会发现它。因此该命令属于Mail,而不属于AppleScript。