编辑AppleScript的麻烦

时间:2011-07-27 20:46:40

标签: compilation applescript

我刚编辑了/ Macintosh HD / Library / Scripts / Folder Actions ... /文件夹中的文件new item alert.scpt。我在编辑了一些权限后设法保存了它,但是当我点击RunCompile时没有任何反应。

这是一个常见的错误,或者如果有人不介意看看我的AppleScript中是否有问题。

property Docs : "Macintosh HD:Users:Max:Downloads:Docs"
property Music : "Macintosh HD:Users:Max:Downloads:Music"
property Videos : "Macintosh HD:Users:Max:Downloads:Videos"
property Images : "Macintosh HD:Users:Max:Downloads:Images"
property Profiles : "Macintosh HD:Users:Max:Downloads:iPhone:Profiles"
property Zips : "Macintosh HD:Users:Max:Downloads:Zips"
property PSDs : "Macintosh HD:Users:Max:Downloads:PSDs"

on adding folder items to this_folder after receiving added_items
    try
        tell application "Finder"
            --get the name of the folder
            set the folder_name to the name of this_folder
            if (name of eachitem ends with ".png") then
                move eachitem to folder Images
            end if
            if (name of eachitem ends with ".JPEG") then
                move eachitem to folder Images
            end if
            if (name of eachitem ends with ".gif") then
                move eachitem to folder Images
            end if
            if (name of eachitem ends with ".jpg") then
                move eachitem to folder Images
            end if
            if (name of eachitem ends with ".jpeg") then
                move eachitem to folder Images
            end if
            if (name of eachitem ends with ".PNG") then
                move eachitem to folder Images
            end if
            if (name of eachitem ends with ".mov") then
                move eachitem to folder Videos
            end if
            if (name of eachitem ends with ".avi") then
                move eachitem to folder Videos
            end if
            if (name of eachitem ends with ".wma") then
                move eachitem to folder Videos
            end if
            if (name of eachitem ends with ".m4v") then
                move eachitem to folder Videos
            end if
            if (name of eachitem ends with ".mp4") then
                move eachitem to folder Music
            end if
            if (name of eachitem ends with ".mp3") then
                move eachitem to folder Music
            end if
            if (name of eachitem ends with ".wav") then
                move eachitem to folder Music
            end if
            if (name of eachitem ends with ".wma") then
                move eachitem to folder Music
            end if
            if (name of eachitem ends with ".pdf") then
                move eachitem to folder Docs
            end if
            if (name of eachitem ends with ".doc") then
                move eachitem to folder Docs
            end if
            if (name of eachitem ends with ".docx") then
                move eachitem to folder Docs
            end if
            if (name of eachitem ends with ".pages") then
                move eachitem to folder Docs
            end if
            if (name of eachitem ends with ".ppt") then
                move eachitem to folder Docs
            end if
            if (name of eachitem ends with ".pptx") then
                move eachitem to folder Docs
            end if
            if (name of eachitem ends with ".mobileprovision") then
                move eachitem to folder Profiles
            end if
            if (name of eachitem ends with ".zip") then
                move eachitem to folder Zips
            end if
            if (name of eachitem ends with ".psd") then
                move eachitem to folder PSDs
            end if


        end tell

        -- find out how many new items have been placed in the folder
        set the item_count to the number of items in the added_items
        --create the alert string
        set alert_message to ("Folder Actions Alert:" & return & return) as Unicode text
        if the item_count is greater than 1 then
            set alert_message to alert_message & (the item_count as text) & " new items have "
        else
            set alert_message to alert_message & "One new item has "
        end if
        set alert_message to alert_message & "been placed in folder " & «data utxt201C» & the folder_name & «data utxt201D» & "."
        set the alert_message to (the alert_message & return & return & "Would you like to view the added items?")

        display dialog the alert_message buttons {"Yes", "No"} default button 2 with icon 1 giving up after dialog_timeout
        set the user_choice to the button returned of the result

        if user_choice is "Yes" then
            tell application "Finder"
                --go to the desktop 
                activate
                --open the folder
                open this_folder
                --select the items
                reveal the added_items
            end tell
        end if
    end try
end adding folder items to

2 个答案:

答案 0 :(得分:0)

文件夹操作脚本不应该直接运行。它通过这些文件夹的上下文菜单与任意数量的文件夹相关联。

然后,只要该文件夹的内容发生更改,就会触发脚本,并运行on adding folder items to处理程序。

因此,您应该右键单击要附加脚本的文件夹,然后选择Set folder action菜单项。

此外,您不应该覆盖系统提供的文件...您可以将自定义版本保存在自己的主目录中,然后将其附加到任何文件夹。

答案 1 :(得分:0)

文件夹操作处理程序将以静默方式失败,因此如果出现错误,脚本将中止。在您发布的脚本中,您根本不会查看添加的项目,而是使用未定义的变量 - eachitem 。另请注意,使用尝试语句时,如果没有错误部分,则只会吃掉任何和所有错误,这对调试也没有帮助。我知道你正在使用Apple的一个示例脚本,但那件事情已经很久了。

我发现使用文件夹操作时最好的方法是将脚本的主要部分放在文件夹操作处理程序之外,这样它也可以正常运行(脚本不需要是致力于成为一个文件夹动作) - 这有助于调试,也可以为您提供applet或Droplet。对于测试,您还可以注释掉文件夹操作处理程序声明并添加语句以获取文件夹和文件。

我希望你不介意,但我冒昧地重新安排你的脚本,以便它也可以从脚本编辑器运行:

property Docs : "Macintosh HD:Users:Max:Downloads:Docs"
property Music : "Macintosh HD:Users:Max:Downloads:Music"
property Videos : "Macintosh HD:Users:Max:Downloads:Videos"
property Images : "Macintosh HD:Users:Max:Downloads:Images"
property Profiles : "Macintosh HD:Users:Max:Downloads:iPhone:Profiles"
property Zips : "Macintosh HD:Users:Max:Downloads:Zips"
property PSDs : "Macintosh HD:Users:Max:Downloads:PSDs"

property dialogTimeout : 10


on run -- script run as an application or from the Script Editor
    set someFiles to (choose file with multiple selections allowed) -- manually get some files
    tell application "Finder" to set containingFolder to (container of first item of someFiles) as alias
    doStuff(containingFolder, someFiles)
end run


on adding folder items to this_folder after receiving added_items -- folder action handler
    doStuff(this_folder, added_items)
end adding folder items to


on doStuff(theFolder, theStuff) -- do stuff with file items in a folder
    set numberOfItems to (count theStuff)
    tell application "Finder"
        set folderName to name of theFolder
        repeat with anItem in theStuff
            if name extension of anItem is in {"png", "jpg", "jpeg", "gif"} then
                move anItem to folder Images
            else if name extension of anItem is in {"mov", "avi", "wma", "m4v"} then
                move anItem to folder Videos
            else if name extension of anItem is in {"mp4", "mp3", "wav", "wma"} then
                move anItem to folder Music
            else if name extension of anItem is in {"pdf", "doc", "docx", "pages", "ppt", "pptx"} then
                move anItem to folder Docs
            else if name extension of anItem is in {"mobileprovision"} then
                move anItem to folder Profiles
            else if name extension of anItem is in {"zip"} then
                move anItem to folder Zips
            else if name extension of anItem is in {"psd"} then
                move anItem to folder PSDs
            else
                -- no match, so leave it
            end if
        end repeat
    end tell

    -- create the alert string
    set alertText to ("Folder Actions Alert:" & return & return) as Unicode text
    if numberOfItems is greater than 1 then
        set alertText to alertText & numberOfItems & " new items have "
        set plural to "s"
    else
        set alertText to alertText & "One new item has "
        set plural to ""
    end if
    set alertText to alertText & "been added to the folder " & «data utxt201C» & folderName & «data utxt201D» & "."
    set alertText to alertText & return & return & "Would you like to view the added item" & plural & "?"

    display dialog alertText buttons {"Yes", "No"} default button 2 with icon 1 giving up after dialogTimeout

    if (button returned of the result) is "Yes" then tell application "Finder"
        activate
        -- open theFolder
        reveal theStuff
    end tell
end doStuff