AppleScript路径在编译时被替换(New Keynote scripting trouble)

时间:2013-11-11 15:53:32

标签: scripting applescript keynote

我们有一个苹果脚本,告诉基于标准删除幻灯片的主题演讲。新的主题演讲没有Applecript字典,但将旧的主题演讲留在子目录中。因此,我试图告诉AppleScript与较旧的应用程序而不是新应用程序进行对话。

如果我只是

tell application "Clean Install:Applications:iWork '09:Keynote.app"

它有效,但它无法识别任何主题词典术语。 (删除幻灯片)。所以我需要把我的老朋友“用来自”。这里的挑战是这是一个预编译指令,所以你必须使用一个字符串文字,由于硬盘名称不同,我在最终用户的机器上没有。

好的,这里还有一个计划。我将写出一个新的applescript文件,其中包含“使用应用程序中的术语”“清理安装:应用程序:iWork '09:Keynote.app”,然后执行该文件...... Genius ...除了AppleScript编译时的事实这一行:

using terms from application "Clean Install:Applications:iWork '09:Keynote.app"

变为:

using terms from application "Keynote"

当然,新的主题词的字典是空的。

有关如何防止AppleScript以这种方式帮助我的任何想法? (或者有更好的计划吗?)

完整代码:

using terms from application "Clean Install:Applications:iWork '09:Keynote.app"

    --using terms from application "Clean Install:Applications:iWork '09:Keynote.app"
    tell application "Clean Install:Applications:iWork '09:Keynote.app"

        activate

    end tell
end using terms from
非常感谢!

2 个答案:

答案 0 :(得分:0)

我在这里盲目(没有主题演讲)......但您是否尝试使用预定义的应用字符串作为变量和原始事件代码?

您可以使用Smile轻松获取原始事件代码

  • 在Smile中创建一个新的脚本窗口;
  • 使用“操作”菜单中的“tell”菜单项使该脚本窗口特定于应用程序(不说明 阻止需要);
  • 写一行代码;选择代码行
  • 然后使用“复制翻译”菜单项(cmd-shift-C) 复制原始事件代码
  • 将原始事件代码代码粘贴到具有您的工作(正常告诉块)脚本的不同窗口中

这是我为Mail应用程序执行此操作时的样子:

set origMail to "MyDrive:Applications:Mail.app"

tell application origMail
    delete («class mssg» 1 of «class mbxp» "INBOX" of «class mact» 1)
end tell

(当放入正常的tell块时,该行代码将为“delete(邮箱1的邮箱”INBOX“帐号1)”)

答案 1 :(得分:0)

我没有试过这个,但我认为它会起作用......当您使用“使用术语”编译代码时,只需将新版本的Keynote放入垃圾箱。这应该强制它使用旧版本的Keynote字典,你的代码应该编译。如果您将该代码保存为“applescript应用程序”,那么它应该可以在任何人的计算机上运行,​​而无需重新编译。注意:在此技巧发挥作用之前,您可能需要重新启动计算机。

然后你就会遇到在用户计算机上定位正确应用程序的问题,因为它们也可能同时具有这两个版本。这里有一些代码可以找到旧版Keynote的路径,以及如何定位它。

set lsregister to "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister"
set appName to "Keynote.app"
set nonapplescriptVersion to "6.0"

-- get the path to all Keynote apps
set appPaths to paragraphs of (do shell script lsregister & " -dump | grep " & quoted form of appName)

-- find the one with a version number less than the nonapplescriptVersion of Keynote
set appPath to missing value
repeat with anApp in appPaths
    try
        -- extract the path
        set AppleScript's text item delimiters to "/"
        set tis to text items of anApp
        set thisPath to "/" & (items 2 thru end of tis) as text
        set AppleScript's text item delimiters to ""

        -- check the version
        if (version of application thisPath) is less than nonapplescriptVersion then
            set appPath to thisPath
            exit repeat
        end if
    end try
end repeat
if appPath is missing value then error "Needed application version not installed."

-- use the older version
using terms from application "Keynote"
    tell application appPath
        activate
        -- do whatever
    end tell
end using terms from