我有一个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
答案 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
的错误)。
无论如何都是奇怪的问题