无法通过AppleScript删除目录

时间:2016-05-28 23:38:02

标签: macos terminal applescript itunes desktop-background

我正在编写一个程序,不断将桌面背景设置为在iTunes中播放的当前歌曲的专辑封面,为此,我将作品写入具有随机ID号的文件中。这意味着桌面每次都会更改为不同的文件。

当然,我希望能够在使用后删除所有这些文件,因此我尝试使用ID删除包含图像的整个文件夹。

但是每次我运行脚本甚至在终端中输入完整目录时,都会收到错误:

“rm:~rf:没有这样的文件或目录 rm:Macintosh:没有这样的文件或目录 rm:HD:用户:BenClose:桌面:iTunesWallpaper:没有这样的文件或目录“

以下是我整个程序的代码,我不知道出了什么问题以及在哪里,所以任何帮助都会非常感激,因为我希望有人希望它能够使用这个程序。

do shell script "rm ~rf " & folderName指的是正在更改的桌面。

screenNum表示是否隐藏创建的文件。 hiddenFile如果为true,"."如果为false(添加到文件名开头的句点将使其隐藏)。

基本上,正在发生的事情是桌面背景被设置为专辑封面99次,之后我希望能够删除所有99个文件并让该过程重新开始。

错误发生在脚本的最末端,它尝试删除图像文件夹。

""

2 个答案:

答案 0 :(得分:1)

问题是shell需要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,您应始终检查folderfile而非文字字符串

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

    (由于桌面文件夹是Finder的 root 文件夹,您甚至可以省略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一个)。仅在应用程序告诉块中包含受影响的术语。

答案 1 :(得分:0)

尝试将rm命令中的“〜”更改为“ - ”,使其如下所示:

do shell script "rm -rf " & folderName

这将rf视为参数而不是文件目录。