如何通过AppleScript判断何时完成iPod同步

时间:2012-02-11 15:17:40

标签: user-interface applescript itunes

我正在尝试制作一个同步和弹出iPod的AppleScript,而不必在脚本启动后提供任何输入。基本脚本是:

set ipodList to {}
tell application "iTunes"
    try
        set ipodList to (name of every source whose kind is iPod)
    end try
    repeat with ipodName in ipodList
        update ipodName
        eject ipodName
    end repeat
end tell

此脚本的问题在于它会导致iTunes在同步开始后立即尝试弹出iPod,因此同步还没有完成。这会导致有时出现一个,有时两个对话窗口。一个窗口说“iTunes正在同步iPod。你确定要弹出它吗?”并有两个按钮,“取消”和“弹出”。另一个窗口显示“iPod”nanoBot“无法弹出,因为它包含其他应用程序正在使用的文件。”并且只有一个“确定”按钮。只需单击“弹出”和“确定”,iTunes就会完成iPod的同步,然后将其弹出。

我想使用UI脚本来点击这两个按钮,以便iTunes能够做我想做的事情。事实上,以下脚本似乎做了我想要的事情:

tell application "System Events"
    tell process "iTunes"
        try
            click button "Eject" of window 1
        end try
        try
            click button "OK" of window 1
        end try
    end tell
end tell

但是,我通过从第二个AppleScript运行它来测试第二位代码。第一个AppleScript的执行挂起了弹出命令,直到我点击两个对话框(如果它只挂在更新命令上,所有这些烦恼都将被解决......)。

有没有办法在弹出命令的同一个脚本中单击对话框?或者某种方式从第一个启动第二个Applescript并让它继续检查这些对话框窗口,然后点击它们?或者这个问题只是一些更简单的解决方案吗?

[编辑:我应该补充一点,我目前所做的只是将iPod与更新命令同步,暂停几秒钟,然后用Finder弹出iPod(我把它设置为磁盘驱动器)。这种方法的问题是无法判断同步完成的时间,如果不是,则脚本不会弹出iPod并引发错误。]

1 个答案:

答案 0 :(得分:1)

试试这个......

set ipodList to {}
tell application "iTunes"
  try
    set ipodList to (name of every source whose kind is iPod)
end try
repeat with ipodName in ipodList
    update ipodName
    tell me to wait_for_sync()
eject ipodName  
end repeat
end tell

on wait_for_sync()
tell application "System Events" to tell application process "iTunes"
    set theStatusText to ""
    repeat until theStatusText is "iPod sync is complete."
        set theStatusText to value of static text 1 of scroll area 1 of window "iTunes"
        delay 1
    end repeat
end tell
end wait_for_sync