我编写了一个 AppleScript,可以让我备份某个文件。该脚本在 AppleScript 编辑器中运行良好:它完美地完成了它应该做的事情。到目前为止一切顺利。
现在我想按时间间隔运行此脚本。因此我使用 launchctl 和 .plist 来实现这一点。这就是麻烦的开始。
- 脚本通过 launchctl 按照设定的时间间隔加载
- AppleScript 编辑器(打开时)会将其窗口(包含该脚本)置于前台,但没有执行任何代码
- 当 AppleScript 编辑器不是跑步,似乎什么都没有发生
关于为什么这不起作用有什么想法吗?
--
经过编辑(按照 Daniel Beck 的建议),我的 plist 现在如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<false/>
<key>Label</key>
<string>com.opera.autosave</string>
<key>ProgramArguments</key>
<array>
<string>osascript</string>
<string>/Users/user_name/Library/Scripts/opera_autosave_bak.scpt</string>
</array>
<key>StartInterval</key>
<integer>30</integer>
</dict>
</plist>
以及我尝试运行的 AppleScript:
on appIsRunning(appName)
tell application "System Events" to (name of processes) contains appName
end appIsRunning
--only run this script when Opera is running
if appIsRunning("Opera") then
set base_path to "user_name:Library:Preferences:Opera Preferences:sessions:"
set autosave_file to "test.txt"
set autosave_file_old to "test_old.txt"
set autosave_file_older to "test_older.txt"
set autosave_file_oldest to "test_oldest.txt"
set autosave_path to base_path & autosave_file
set autosave_path_old to base_path & autosave_file_old
set autosave_path_older to base_path & autosave_file_older
set autosave_path_oldest to base_path & autosave_file_oldest
set copied_file to "test copy.txt"
set copied_path to base_path & copied_file
tell application "Finder"
duplicate file autosave_path
delete file autosave_path_oldest
set name of file autosave_path_older to autosave_file_oldest
set name of file autosave_path_old to autosave_file_older
set name of file copied_path to autosave_file_old
end tell
end if
答案1
在 AppleScript 编辑器中将脚本另存为应用程序 (文件»另存为...),或者将 launchd 中的调用更改plist
为 open osascript
(执行 AppleScript 的终端方式),并以脚本文件作为参数。
答案2
似乎受到这个影响:
因此,如果您“手动”运行脚本(无论是从 AppleScript 编辑器、Automator 内部还是作为独立应用或 Droplet),它都应该能够执行脚本所要求的任何操作,就像现在一样。换句话说,您应该能够像往常一样继续手动运行脚本。
内部应用程序脚本:某些应用程序使用“内部”AppleScript 来处理其自身的某些操作。(例如,BBEdit ( ) 在安装其命令行工具时使用此类脚本。)此类脚本内置于应用程序中;您永远不会在菜单或其他地方看到它们。此类自引用脚本应该继续像往常一样工作。
但是,如果沙盒应用程序想要使用 AppleScript 与其他应用程序或系统的其他部分进行交互(例如,使用 AppleScript 控制 iTunes 的菜单栏应用程序),那么新的限制就会生效。沙盒应用程序不能使用 AppleScript 与 Mac 上的其他应用程序通信,除非开发人员明确请求(并收到)这样做的权利。