使用传递的参数时,防止AppleScript脚本更改自己的修改日期

时间:2012-02-28 18:16:35

标签: applescript osx-lion

我有一个AppleScript脚本用于通过GeekTool在我的桌面上显示iTunes曲目信息。我使用on runargv将不同的参数传递给脚本,这样我就可以显示轨道信息的不同部分而不会复制脚本(例如,我可以通过运行osascript itunes.scpt title获得标题,我可以获得通过运行osascript itunes.scpt album)的艺术家/专辑。

但是,每次我使用参数运行脚本时,实际的文件修改日期都会更改 - 似乎脚本正在将某些内容写入自身或进行某种修改。

这通常不是问题,除了在OS X 10.7中,Lion为超过2周未修改的文件引入了文件锁定。一旦我的iTunes脚本被操作系统锁定,它运行时就无法再进行这些不可见的自我更新,而且我的系统日志也会出现如下错误:

osascript: couldn't save changes to script /path/to/script: error -54

我可以通过手动对脚本进行一些修改(例如添加空行)来暂时解决这个问题,但两周之后,由于Lion将其锁定,所以它们再次发生故障。

理论上我可以禁用系统范围内的文件锁定来解决这个问题,但我宁愿不 - 我喜欢它用于其他事情。

那么,如何在没有更改该脚本的修改日期的情况下使用on run argv将参数传递给AppleScript文件

这是一个最小的工作示例。如果从命令行(oscascript test.scpt blah)运行此命令,则脚本的修改日期将更改。

--test.scpt
on run argv
    tell application "iTunes"
        if player state is playing then
            set trck to current track
            set title_text to (get name of trck)
            return title_text & " " & item 1 of argv
        end if
    end tell
end run

2 个答案:

答案 0 :(得分:4)

除了常规AppleScript(不是Xcode变体)中定义的属性外,所有全局变量都是持久性的,并且使用脚本保存(至少在重新编译之前)。这包括运行处理程序(显式或隐含)中定义的项目,例如:

on run
    try
        display dialog someVariable -- will error the first time
    on error -- set global
        beep
        set someVariable to time string of (current date)
    end try
end run

您可以尝试将代码移动到处理程序,以便不设置或更改全局变量。

答案 1 :(得分:0)

您可以尝试通过stdin将脚本提供给osascript,而不是直接读取它。

osascript - args < /path/to/script 

cat /path/to/script | osascript - args

您需要其中的短划线(请参阅osascript

的联机帮助页

但是,我无法重现修改时间更新的行为(我在Snow Leopard上),所以我不知道这是否会有所不同。但它可能有效,因为osascript与文件没有直接联系(如果确实是osascript的错误)。

无论如何都是奇怪的问题