Что такое ошибка -10004 и ошибка -10000 в Applescript

У меня есть Applescript, который работает на моем компьютере, но не на компьютере моего коллеги. Я получаю две ошибки при манипулировании путями: -10004 и -10000. У меня есть идея о том, как это решить, но сначала Я хотел бы понять эти коды ошибок.

Вот скрипт (бесполезную часть я удалил, полная версия находится на github ):

-- export all layers to image files

-- Settings
property exportFileExtension : "png"
property ADD_CANVAS_NUMBER : true
-- End of Settings

on file_exists(FileOrFolderToCheckString)
   try
       alias FileOrFolderToCheckString
       return true
   on error
       return false
   end try
end file_exists

tell application "OmniGraffle Professional 5"
    set theWindow to front window
    set theDocument to document of theWindow
    set theFilename to name of theDocument
    -- remove .graffle
    -- FIRST ERROR IS HERE -10004
    set theFilename to text 1 thru ((offset of "." in theFilename) - 1) of theFilename

    set export_folder to (choose folder with prompt "Pick the destination folder") as string
    set export_folder to export_folder & theFilename & ":"

    -- create folder
    if file_exists(export_folder) of me then
        try
            display alert "The file already exists. Do you want to replace it?" buttons {"Cancel", "Erase"} cancel button 1
        on error errText number errNum
            if (errNum is equal to -128) then
                return
            end if
        end try

        -- deletes the folder (necessary because some layers may have been renamed
        do shell script "rm -rf " & quoted form of POSIX path of export_folder

    else
        -- creates the folder
        do shell script "mkdir -p " & quoted form of POSIX path of export_folder
    end if

    set canvasCount to count of canvases of theDocument

    set i to 0
    repeat with canvasNumber from 1 to canvasCount
        set theCanvas to canvas canvasNumber of theDocument
        set canvas_name to name of theCanvas
        set canvas of theWindow to theCanvas
        set layerCount to count of layers of theCanvas

        -- ...

        set area type of current export settings to current canvas
        set draws background of current export settings to false
        set include border of current export settings to false

        set canvas_filename to ""
        -- ...
        set canvas_filename to canvas_filename & canvas_name

        repeat with layerNumber from 1 to layerCount
            set theLayer to layer layerNumber of theCanvas

            if (theLayer is prints) and (class of theLayer is not shared layer) then
                set layer_name to name of theLayer as string
                set filename to canvas_filename & " - " & layer_name & "." & exportFileExtension
                set export_filename to export_folder & filename

                -- show the layer, export, then hide the layer
                if character 1 of layer_name is not "*" then
                    set visible of theLayer to true
                    -- SECOND ERROR IS HERE -1000
                    save theDocument in export_filename
                    set visible of theLayer to false
                end if

            end if

        end repeat

    end repeat
end tell

Вот журнал:

tell application "OmniGraffle Professional 5"
   get window 1
       --> window id 5032
   get document of window id 5032
       --> document "MSD.graffle"
   get name of document "MSD.graffle"
       --> "MSD.graffle"
   offset of "." in "MSD.graffle"
       --> error number -10004
end tell
tell current application
   offset of "." in "MSD.graffle"
       --> 4
end tell
tell application "OmniGraffle Professional 5"
   choose folder with prompt "Pick the destination folder"
       --> alias "Macintosh HD:Users:Romain:Desktop:Temp:"
   display alert "The file already exists. Do you want to replace it?" buttons {"Cancel", "Erase"} cancel button 1
       --> {button returned:"Erase"}
   do shell script "rm -rf '/Users/Romain/Desktop/Temp/MSD/'"
       --> error number -10004
end tell
tell current application
   do shell script "rm -rf '/Users/Romain/Desktop/Temp/MSD/'"
       --> ""
end tell
tell application "OmniGraffle Professional 5"
...
...
   save document "MSD.graffle" in "Macintosh HD:Users:Romain:Desktop:Temp:MSD:1- Navigation - 1Layout.png"
       --> error number -10000
Result:
error "OmniGraffle Professional 5 got an error: AppleEvent handler failed." number -10000

Спасибо!


Я обновил скрипт, но все равно получаю ошибку -10000. Вот измененные строки:

save theDocument in file exportFilename

а также

-- Create folder if does not exist, remove it otherwise
-- Shell script should not be executed inside tell application block
if file_exists(export_folder) of me then
    try
        display alert "The file already exists. Do you want to replace it?" buttons {"Cancel", "Erase"} cancel button 1
    on error errText number errNum
        if (errNum is equal to -128) then
            return
        end if
    end try

    tell me
        -- Delete the folder
        do shell script "rm -rf " & quoted form of POSIX path of export_folder
    end tell

else
    tell me
        -- Create the folder
        do shell script "mkdir -p " & quoted form of POSIX path of export_folder
    end tell
end if

person charlax    schedule 09.02.2012    source источник


Ответы (2)


Ошибки -10000 - -10015 являются ошибками реестра событий.

Ошибка -10000 сама по себе не является целевой ошибкой, потому что в большинстве случаев она выдает -1708. в большинстве случаев это не ошибка цели, а неполная команда или неправильное использование скобок. Что делать, если вы используете:

save theDocument in file export_filename

Ошибка -10004 — это ошибка нарушения привилегий, что означает, что вы делаете что-то с файлом, что не разрешено. Вероятно, вам не разрешено удалять файл, и команда do shell script всегда должна использоваться вне блоков приложения. Проблема в том, что целевое приложение может работать как другой пользователь, чем скрипт. Я не говорю, что это ошибка, но есть вероятность, что это проблема. В противном случае у вас просто недостаточно привилегий, и вам нужно запросить у пользователя права администратора.

do shell script "do something" with administrator privileges.
person dj bazzie wazzie    schedule 09.02.2012
comment
Спасибо за Ваш ответ! Я обновил свой вопрос новым скриптом, который я использую, он дает мне ту же ошибку (-10000). - person charlax; 10.02.2012

Я не нашел, где задокументированы эти коды ошибок, но в основном они связаны с событиями, которые целевое приложение не может выполнить. Первые две ошибки -10004 возникают из-за использования команды Standard Additions внутри оператора tell приложения (offset и do shell script) — приложение не не знает, что это за команды, передает ошибку вверх по цепочке в AppleScript, но AppleScript знает, что это такое, и делает это.

У меня нет OmniGraffle, но последняя ошибка сообщает вам, что команду сохранения невозможно выполнить, вероятно, из-за проблемы с местом назначения, которое не является спецификатором файла — это просто текстовая строка, поэтому у вас, вероятно, будет заставить его сделать то, что хочет команда.

person Community    schedule 09.02.2012
comment
Спасибо! Принудил как файл но не работает. Это работает на моем компьютере. - person charlax; 10.02.2012
comment
Ему может понадобиться псевдоним или путь POSIX — вам нужно будет проверить словарь сценариев, чтобы увидеть, что он хочет для команды сохранения. - person ; 10.02.2012
comment
Я не могу указать его как псевдоним, потому что файл не существует, хотя словарь сценариев говорит мне, что ему нужен псевдоним (это из Standard Suite). - person charlax; 11.02.2012