Не удается удалить каталог через AppleScript

Я пишу программу, которая постоянно устанавливает фон рабочего стола на обложку альбома текущей песни, воспроизводимой в iTunes, и для этого я записываю обложку в файл со случайным идентификационным номером. Это означает, что рабочий стол каждый раз будет меняться на другой файл.

Конечно, я хочу иметь возможность удалять все эти файлы после того, как они были использованы, поэтому я пытаюсь использовать do shell script "rm ~rf " & folderName для удаления всей папки, содержащей изображения.

Однако каждый раз, когда я запускаю свой скрипт или даже ввожу полный каталог в Терминал, я получаю сообщение об ошибке:

"rm: ~rf: Нет такого файла или каталога rm: Macintosh: Нет такого файла или каталога rm: HD:Users:BenClose:Desktop:iTunesWallpaper: Нет такого файла или каталога"

Ниже приведен весь код моей программы, я понятия не имею, что и где происходит, поэтому любая помощь будет очень признательна, так как я хотел бы, чтобы любой, кто хочет, мог использовать эту программу.

screenNum указывает на то, какой рабочий стол изменяется.

hiddenFile указывает, будут ли созданные файлы скрыты. ".", если правда, и "", если ложь (точка, добавленная к началу имени файла, сделает его скрытым).

По сути, происходит то, что фон рабочего стола устанавливается на обложку альбома 99 раз, после чего я хотел бы иметь возможность удалить все 99 файлов и позволить процессу начаться снова.

Ошибка возникает в самом конце скрипта, где он пытается удалить папку с изображениями.

set screenNum to 2
set directoryName to "iTunesWallpaper"
set fileExt to "jpg"
set hiddenFile to ""
set repeatTrue to 1
set loopLimit to 99
set looped to 0
set folderName to ((path to desktop) as text) & hiddenFile & directoryName
repeat while repeatTrue is 1
    tell application "Finder"
        if (exists folderName) is not true then
            make new folder at (path to desktop) as text with properties {name:hiddenFile & directoryName}
        end if
    end tell
    set randID to screenNum
    set randLoop to 0
    repeat while randLoop is not 9
        set randNum to (random number from 0 to 9) as text
        set randID to randID & randNum
        set randLoop to randLoop + 1
    end repeat
    tell application "System Events"
        set fileName to {((path to desktop) as text) & hiddenFile & directoryName & ":" & randID & "." & fileExt}
        set changeDesktop to 0
        if process "iTunes" exists then
            tell application "iTunes"
                if (player state is not stopped) then
                    if exists artworks of current track then
                        set changeDesktop to 1
                        -- get the raw bytes of the artwork into a var
                        tell application "iTunes" to tell artwork 1 of current track
                            set srcBytes to raw data
                        end tell
                        -- write to file
                        set outFile to open for access file fileName with write permission
                        -- truncate the file
                        set eof outFile to 0
                        -- write the image bytes to the file
                        write srcBytes to outFile
                        close access outFile
                    end if
                end if
            end tell
            if changeDesktop = 1 then
                if exists desktop screenNum then
                    tell desktop screenNum
                        set picture to fileName
                    end tell
                end if
            end if
        end if
    end tell
    set looped to looped + 1
    if looped is loopLimit then
        do shell script "rm ~rf " & folderName
        set looped to 0
    end if
end repeat

person Ben Close    schedule 28.05.2016    source источник
comment
фон рабочего стола устанавливается на обложку альбома 99 раз, почему?   -  person l'L'l    schedule 29.05.2016
comment
@l'L'l Фон рабочего стола требует нового имени файла каждый раз, когда он устанавливается, иначе мы столкнемся с проблемами, когда рабочий стол запутается и мерцает между разными изображениями. Я выбрал 99, чтобы каждые несколько секунд удалялись все файлы. Регулярное удаление файлов означает, что приложение не окажет негативного влияния на хранилище пользователя.   -  person Ben Close    schedule 29.05.2016


Ответы (2)


Проблема в том, что оболочка ожидает путь POSIX (разделенный косой чертой)

do shell script "rm -rf " & quoted form of POSIX path of folderName

Некоторые другие проблемы / примечания, чтобы сделать скрипт более надежным:

  • path to имеет параметр as text. Используйте это вместо принуждения

    set folderName to (path to desktop as text) & hiddenFile & directoryName
    
  • В Finder есть свойство desktop, и вы всегда должны проверять folder или file, а не литеральную строку.

    tell application "Finder"
        if not (exists folder folderName) then
            make new folder at desktop with properties {name:hiddenFile & directoryName}
        end if
    end tell
    

    (Поскольку папка рабочего стола является корневой папкой Finder, вы можете даже опустить at desktop).

  • randID будет списком, потому что screenNum является целым числом, но тогда вы добавляете строки, поэтому приведите randID к тексту.

    set randID to screenNum as text
    
  • Выражение while для создания случайного числа не требуется. AppleScript может повторяться определенное количество раз.

    set randID to screenNum
    repeat 9 times
       set randNum to (random number from 0 to 9) as text
       set randID to randID & randNum
    end repeat
    
  • fileName также является списком, который не предназначен. Удалите фигурные скобки.

    set fileName to (path to desktop as text) & hiddenFile & directoryName & ":" & randID & "." & fileExt
    
  • Используя команду write, вы должны отлавливать потенциальные ошибки, поскольку в противном случае закрытие файла может быть предотвращено. Добавление блоков try - on error гарантирует надежное закрытие всех файлов.

    try
        -- write to file
        set outFile to open for access file fileName with write permission
        -- truncate the file
        set eof outFile to 0
        -- write the image bytes to the file
        write srcBytes to outFile
    
        close access outFile
    on error
            try
                close access file fileName
            end try
    end try
    
  • Вместо того, чтобы спрашивать System Events, запущен ли процесс, вы можете спросить само приложение.

    if application "iTunes" is running then
    
  • И последнее, но не менее важное: избегайте больших вложенных блоков сообщений приложения (например, System Events). Оберните только затронутую терминологию в блоке сообщения приложения.

person vadian    schedule 29.05.2016

Попробуйте изменить «~» в вашей команде rm на «-», чтобы это выглядело так:

do shell script "rm -rf " & folderName

Это рассматривает rf как аргумент, а не как файловый каталог.

person Chase    schedule 29.05.2016
comment
Это не работает. Я больше не сталкиваюсь с какой-либо ошибкой, но файлы вообще не удаляются. - person Ben Close; 29.05.2016