AppleScript:如何将文件夹的路径名存储到数组中,用“\”替换空格?


0

我有一个文件夹,在这个文件夹里面有一堆子文件夹。使用AppleScript我希望将这些子文件夹的路径名存储到一个数组中。

这是我的问题:每个包含“  ”(空格)的路径名,我想用包含UNIX友好“ ”符号的路径名替换(反斜杠后跟一个空格;如同/my/fancy\ path/)。

正如你所看到的,我在这里的目标只有一半。我花了一个晚上值得费力的尝试,愚弄replace_chars子程序, - do shell scriptwith- sedcombos,谁知道什么。没有骰子。

tell application "Finder"

    set myRepos to name of folders of folder ("/Users/hced/Dropbox/GitHub/" as POSIX file)
    --> {"320andup", "Baseline.js (jQuery & vanilla JS version)", "Bootstrap (HTML, CSS, and JS toolkit from Twitter)", "Chirp.js (Tweets on your website, simply)", "Coordino"}

end tell

编辑:一个有效的路径示例/Users/hced/Dropbox/GitHub/A\ folder\ named\ with\ spaces


您是否试图逃避传递回shell命令的路径?
adayzdone

adayzdone:是的。我想通过Keyboard Maestro中的宏来迭代数组中的项目(解释完整故事有点复杂)。此外,问题的某些部分只是因为我很好奇。
Henrik

其实-这可能不是(或一个)推荐的处事混帐明智的方式,但-我的最终目标是为解析子我的GitHub上一层文件夹下,然后质量- git fetch在所有的回购。野蛮,是的,但我没有找到在GitHub.app(Mac)中做到这一点的方法,而且所有项目都只是我自己没有触及(分叉)的东西,我只想要最新的一切。在这种情况下AppleScript的选择是因为我将myRepos的内容存储为Keyboard Maestro中的变量...听起来像一团糟?的确,但这就是故事。
Henrik

Answers:


2

阅读你的问题,我不确定你是否能够使用引用的路径名而不是转义空格...

tell application "Finder"
        set folderGitHub to folder ("/Users/hced/Dropbox/GitHub/" as POSIX file)

        set listFolders to (every folder in folderGitHub as alias list)
end tell

set listPosixPathsQuoted to {}

repeat with aliasFolder in listFolders
        set listPosixPathsQuoted to listPosixPathsQuoted & {quoted form of POSIX path of aliasFolder}
end repeat

1

这应该这样做:

tell application "Finder"
    set myRepos to name of folders of folder ("/Users/hced/Dropbox/GitHub/" as POSIX file)
end tell

repeat with theIndex from 1 to number of items in myRepos
    set item theIndex in myRepos to replace_chars(item theIndex in myRepos, " ", "\\ ")
end repeat

return myRepos

on replace_chars(this_text, search_string, replacement_string)
    set AppleScript's text item delimiters to the search_string
    set the item_list to every text item of this_text
    set AppleScript's text item delimiters to the replacement_string
    set this_text to the item_list as string
    set AppleScript's text item delimiters to ""
    return this_text
end replace_chars

这将获取您已经获得的文件夹名称,并循环遍历列表中的每个项目,替换每个空格字符\。请注意,需要对反斜杠进行转义,AppleScript Editor会将字符串显示为包含双反斜杠。但是,您可以通过set the clipboard to item 2 of myRepos将生成的文本粘贴到文本编辑器中来验证它们是否通过单个反斜杠正确转义- 这只是AppleScript编辑器的一个怪癖。

replace_chars功能是一个相当标准的样板。我从Mac OS X Automation复制了它。


与adayzdone上面的脚本类似,这会输出不符合有效UNIX路径的结果([:space:]替换为(反斜杠+空格)。\ 使用AppleScript 无法实现吗?以下是脚本的示例输出: {“320andup”,“Baseline.js \\(jQuery \\&\\ vanilla \\ JS \\ version)”,“Bootstrap \\(HTML,\\ CSS,\\和\\ JS \\ toolkit \\来自\\ Twitter)“,”Chirp.js \\(Tweets \\ on \\ your \\ website,\\ simply)“,”Coordino“}
Henrik

1
正如我所说,这只是AppleScript编辑器显示的输出。实际数据采用您指定的格式。您可以通过set the clipboard to myRepos as stringreturn命令之前添加一行来测试它,然后粘贴到文本编辑器中。你会发现空间是用单个反斜杠转义的。如果您需要以其他方式使用输出的特定帮助,请将其添加到您的问题中,我可以修改我的答案。
12

0

MacScripter上发布的Trash Man的处理程序将逃脱所有问题角色......

set myFolder to quoted form of "/Users/hced/Dropbox/GitHub/"

    set theFolders to every paragraph of (do shell script "find " & myFolder & " -type d -depth 1 ")
    set escFolders to {}

    repeat with aFolder in theFolders
        set end of escFolders to escape_string(aFolder as text)
    end repeat

    on escape_string(input_string)
    set output_string to ""
    set escapable_characters to " !#^$%&*?()={}[]'`~|;<>\"\\"
    repeat with chr in input_string
        if (escapable_characters contains chr) then
            set output_string to output_string & "\\" -- This actually adds ONE \ to the string.
        else if (chr is equal to "/") then
            set output_string to output_string & ":" -- Swap file system delimiters
        end if
        set output_string to output_string & chr
    end repeat
    return output_string as text
end escape_string

这不会输出我正在寻找的路径格式。脚本输出例如/Users/hced/Dropbox/GitHub//Baseline.js(jQuery和vanilla JS版)我正在努力学习如何在AppleScript字符串中实际输出...似乎不可能。
Henrik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.