Path 路径问题-POSIX HFS无法获取文件夹

Path 路径问题-POSIX HFS无法获取文件夹,path,applescript,osascript,Path,Applescript,Osascript,我正在努力让这个简短的脚本发挥作用。它所要做的就是将本地用户的应用程序支持/应用程序中文件夹的内容移动到usb set localLocation to POSIX path of (path to library folder from user domain) & "Application\\ Support/myApp" as text set usbLocation to "/Volumes/myUsb/myApp"

我正在努力让这个简短的脚本发挥作用。它所要做的就是将本地用户的应用程序支持/应用程序中文件夹的内容移动到usb

set localLocation to POSIX path of (path to library folder from user domain) & "Application\\ Support/myApp" as text
set usbLocation to "/Volumes/myUsb/myApp"                                   
tell application "Finder" to move entire contents of folder localLocation to folder usbLocation
两个目录(USB和Computer)中都有一个文件夹,与此处描述的自定义路径描述“myApp”相匹配。代码在tell的第一部分中有一个错误,无法在应用程序支持中找到该文件夹。我不知道为什么会出现这种情况,我也很难理解HFS和POSIX之间的区别,到底应该使用哪一种?我感觉类型可能存在连接错误。我是初学者,请帮忙


谢谢

了解AppleScript如何处理文件和文件夹引用是一件令人头痛的事情,众所周知,它对文件说明符和路径字符串的处理非常复杂和繁琐

简单定义:
Posix路径:
由前斜杠组成的路径,在目录树中分隔文件夹,例如
/Users/CK/Downloads/Some_File.txt
。 根目录(顶级)由单个转发表示 斜杠,
/
。每个posix路径都是从这个根目录派生的, 因此,一般来说,posix路径必须以正斜杠开始。 文件夹路径理想情况下以终止正斜杠结束;文件路径 不要;但这并不严格

HFS路径:
由冒号组成的路径,在目录树中分隔文件夹,例如
Macintosh HD:Users:CK:Downloads:Some_File.txt
。 根目录由
Macintosh HD:
表示,它总是 开始HFS路径(除非您的系统硬盘被称为 否则)。文件夹路径最好以终止冒号结尾;文件路径 不要;这是半严格的

这就是你需要知道的关于posix路径和HFS路径的所有信息,来做一些应用程序描述。最困难的部分是掌握AppleScript的文件类类型。有三种:

别名:
这些是您的朋友,在与Finder或系统事件一起使用时,以及在引用 文件或文件夹。它们是一个AppleScript对象 包含指向现有文件的文件引用。尝试 将
别名
类类型指定给以下文件的文件引用: 不存在将抛出错误

文件:
这些是一个文件引用对象,可能指向一个尚不存在的文件。它限定HFS路径字符串, 将其标识为文件的路径,而不仅仅是一段文本。这个
文件
别名
之间的关键区别在于
文件
是静态的 引用,这意味着如果它指向具有给定名称的文件 该文件的名称更改,
文件
对象现在将引用一个文件 这是不存在的。另一方面,
别名
,是动态的 即使在重命名或移动文件后也会移动其引用

POSIX文件:
如果您喜欢使用POSIX路径(您应该这样做),那么
POSIX文件
对象就是您的最好的朋友。它采用posix路径 字符串,并以大致相同的方式将其限定为文件路径
文件
不适用于HFS路径字符串。同样,它也是一个静态引用 并且可以指向不存在的文件或文件夹

我的推荐 我的感觉是,对于命令行用户和AppleScripting之间的简单交互来说,HFS路径是一个不必要的复杂因素。它们确实让人困惑,而且由于通过AppleScript返回的结果可以广泛观察到这种符号,因此在使用中它们似乎是强制性的

事实并非如此。一、 就个人而言,从不使用HFS路径。(几乎从来没有)

一个本质上并不比另一个好,这实际上只是个人的喜好。因此,我的建议是选择一种您最熟悉的样式,并学习如何在AppleScript设置中操作该类型的路径

在使用posix路径时,我关心的是
posix文件
对象和
alias
对象。这就是我现在将在接下来的回答中重点关注的问题

你的剧本 您的脚本引发了第一个错误,因为您试图转义文件路径字符串中的空格,这可能是在终端中键入的习惯。除了反斜杠
\
,文件字符串中的任何字符都不需要转义,因为文件路径字符串总是用双引号括起来

仍然在处理脚本的第一行,您已经非常正确地检索到了
库文件夹
路径(它返回一个
别名
);将其转换为posix路径字符串;然后附加
“应用程序支持/myApp”
路径文本。但是,知道您实际上可以获得
应用程序支持
文件夹的
路径可能会有所帮助,因此您的第一行可以成为:

set localLocation to POSIX path of (path to application support from user domain) & "myApp"
结果是一个posix路径字符串,但不是一个文件对象(但目前还可以)

然后,下一行显式声明posix路径字符串:

set usbLocation to "/Volumes/myUsb/myApp"
这是绝对好的

接下来是棘手的事情:使用Finder:

也就是说,你几乎做到了完美。因为您使用的是posix路径,所以您需要将它们转换为
alias
对象,或者向finder解释它正在处理posix路径,而这正是
posix文件
对象所做的

要创建
POSIX文件
对象,可以将
POSIX文件
说明符前置到POSIX路径字符串,如下所示:

set usbLocation to POSIX file "/Volumes/myUsb/myApp"
set usbLocation to "/Volumes/myUsb/myApp" as POSIX file
或者对类型类执行更常规的强制,如下所示:

set usbLocation to POSIX file "/Volumes/myUsb/myApp"
set usbLocation to "/Volumes/myUsb/myApp" as POSIX file
在任何一种情况下
tell application "Finder" to move entire contents of ¬
    folder (localLocation as POSIX file) to folder (usbLocation as POSIX file)
set localLocation to POSIX path of (path to application support folder from user domain) & "myApp" as POSIX file
set usbLocation to POSIX file "/Volumes/myUsb/"

tell application "Finder" to move folder localLocation to folder usbLocation with replacing
set usbLocation to POSIX file "/Volumes/myUsb/myApp" as alias
set usbLocation to "/Volumes/myUsb/myApp" as POSIX file as alias
tell application "Finder" to set S to selection as alias list

tell application "System Events" to get properties of item 1 of S
tell application "Finder" to get entire contents of ¬
    (path to downloads folder) as alias list
-- 1.45s

tell application "Finder" to get entire contents of ¬
    (path to downloads folder)
-- 2.29s
set localLocation to POSIX path of (path to application support folder from user domain) & "myApp" as POSIX file as alias
set usbLocation to POSIX file "/Volumes/myUsb/" as alias

tell application "Finder" to move localLocation to usbLocation with replacing
set localLocation to (path to application support folder from user domain as text) & "myApp"                                  
tell application "Finder" to move entire contents of folder localLocation to folder "myApp" of disk "myUsb"
set localLocation to POSIX path of (path to application support folder from user domain) & "myApp/" 
set usbLocation to "/Volumes/myUsb/myApp"                                    
do shell script "/bin/cp " & quoted form of localLocation & "*" & space & quoted form of usbLocation