【问题标题】:OS X 10.9 Applescript changes: using the `move` command in the "System Events" context to move a fileOS X 10.9 Applescript 更改:使用“系统事件”上下文中的“移动”命令移动文件
【发布时间】:2014-04-01 17:12:13
【问题描述】:

我去运行一个旧脚本,它在 10.9 更新后坏了。我曾经使用以下代码移动带有系统事件的文件。

set Somefilepath to "Design_005_HD:Users:Design_005:Desktop:Start:TextFile.txt"
set somefolderpath to "Design_005_HD:Users:Design_005:Desktop:End:"

tell application "System Events"
move file (Somefilepath) to folder (somefolderpath)
end tell

现在它给了我以下错误。

error "系统事件出错:无法生成文件 \"Design_005_HD:Users:Design_005:Desktop:Start:TextFile.txt\" 进入 输入整数。”来自文件的数字 -1700 "Design_005_HD:Users:Design_005:Desktop:Start:TextFile.txt" 为整数

我知道我可以将其换掉并使用 finder,但我宁愿不使用它。哪些更改不再有效?

2014 年 4 月 2 日更新

我已经尝试过将文件/文件夹位置提供给系统事件的各种方式,但它不起作用。我很高兴不是我不能让它发挥作用。如果我找到答案或进行有效更新,我会更新这篇文章。

2014 年 4 月 3 日更新

看来这只是系统事件无法移动文件的错误。我已经在这里报告了http://bugreport.apple.com/,其他人也应该这样做。

请不要把我的代码放在心上,这只是我无法让它工作的地方。我有 10.8.5 的工作代码,它是上面显示的内容减去系统事件告诉块中的文件夹标签。不知道为什么它可以在没有文件夹标签的情况下工作,但确实可以。在多个组合上进行了测试。如果它没有损坏,请不要大惊小怪。注意到它并继续前进。

2014 年 10 月 20 日更新

对于任何有兴趣的人。我收到一封电子邮件,说明我的票已关闭/解决。所以小牛队将永远被打破,但当它出现时,优胜美地可能会有光明。

【问题讨论】:

  • 只需使用"Finder"context 而不是“系统事件”上下文来解决问题。在评论中,您说:“我避免使用 Finder,因为它似乎更慢,而且我不太了解使用它们的 shell 脚本。” - 虽然我没有测试,但不确定使用 Finder 是否会更慢 - 启动成本不是问题,因为 Finder 一直在运行。您还可以将 Finder 的使用限制为移动操作。
  • 我已经更新了我的答案,向您展示了 HFS 样式(基于冒号)路径和 POSIX 样式路径(如您问题的原始版本)的解决方法。将来,我鼓励您不要在没有评论的情况下过于彻底地修改您的问题,因为这可能(部分)使一些已经给出的答案无效并使未来的访问者感到困惑。我已经通过bugreport.apple.com 向 Apple 提交了错误报告,我鼓励您也这样做(遗憾的是,错误报告不公开,但越多的人告诉他们某个特定错误,他们就越有可能注意到.)
  • 明确一点:10.8 too 中存在该错误,您只是发现了省略folder 类型说明符的“漏洞”;关键是:它应该folder类型说明符一起工作,并且使用该说明符是编写该命令的正确方式。使用 tell application "Finder" 而不是在 10.8 和 10.9 上都可以使用,并且通常是用于文件系统 操作 任务的方法。
  • 更新:使用Finder 确实比使用System Events 慢得多,尤其是在迭代文件夹中的项目时;也就是说,在手头的情况下,差异可以忽略不计。

标签: applescript osx-mavericks move file-move


【解决方案1】:

一般来说,Applescript 使用冒号分隔的路径 (:) 而不是斜线分隔的路径 (/)。我说一般是因为某些应用程序可以使用斜杠,但所有程序都可以使用冒号。有关冒号路径的示例,请尝试此代码并查看结果...

set colonPath to (path to desktop as text) & "untitled folder 2:"

所以首先我会将你的斜杠转换为冒号样式。

对于applescript,这些只是字符串而不是路径。为了让 applescript 理解它们是路径,我们可以做一些事情。首先,您可以根据需要在它们前面添加单词文件或文件夹。我注意到在您的代码中,您在文件字符串前面使用了“文件”,但您没有在文件夹字符串前面使用“文件夹”。所以试试吧。其次,您可以在字符串前面使用“别名”,无论它们是文件还是文件夹。还有其他方法,但我会在这里停下来。这些方法中的任何一种都应该有效。

更新:综上所述,似乎 10.9 中的系统事件在移动命令方面仍然存在问题。因此,这里有 2 个供您选择。我使用斜线样式路径,因为这就是您正在使用的。

set somefilepath to POSIX file "/Users/Design_005/Desktop/Start/TextFile.txt"
set somefolderpath to POSIX file "/Users/Design_005/Desktop/End"

tell application "Finder"
    move somefilepath to somefolderpath
end tell

set somefilepath to "/Users/Design_005/Desktop/Start/TextFile.txt"
set somefolderpath to "/Users/Design_005/Desktop/End"

do shell script "mv " & quoted form of somefilepath & space & quoted form of somefolderpath

祝你好运。

【讨论】:

  • 感谢您的回复。我理解你所说的并且通常使用冒号。在 OSX 10.8 上,我的脚本可以工作,而现在在 OSX 10.9 上却不行。为了表达当前的关注,我重新编译并更新了帖子。
  • +1 获取背景信息;给事物起个名字:“冒号路径”=HFS 风格的路径; “斜线路径” = POSIX 风格的路径。
  • 蒂姆,你的代码有很多问题。但是,即使我修复了错误,系统事件在 10.9 上也遇到了 move 命令的问题。因此,请参阅我的帖子的更新以获取 2 个替代方案和无错误代码。
  • 感谢您的帮助!我一直认为使用 POSIX 文件将字符串转换为冒号格式的版本。早在我第一次开始时,我就对其进行了测试并获得了该格式并将其用作转换器。我只想使用“文件”而不是“POSIX 文件”,并且似乎确实留在了帖子上。本示例中使用斜线是因为我可以轻松地将文件夹拖到编辑器中并让它生成字符串。我避开了 finder,因为它似乎更慢,而且我不太了解使用它们的 shell 脚本。
  • @TimJoe: POSIX file 返回 file OBJECT,而不是 HFS 样式(以 : 作为分隔符)字符串。如果您随后 - 通过as text 隐式或显式 - 将此 OBJECT 转换为字符串,您将获得 HFS 样式的路径。 (您还可以使用POSIX path of ... 从对象中获取 POSIX 样式的路径 - 奇怪的是,path of ... 无法获取 HFS 样式的路径 - 使用 ... as text)。另请注意,即使您的代码在概念上不是最清晰的,您的代码本身没有问题 - 这是一个 AppleScript 错误。
【解决方案2】:

你不能这样做。系统事件可以删除和打开,但不能移动。这是一个简单的例子,以防它帮助其他人在未来的操作系统中找到更好的答案。系统事件似乎对待移动不同于删除和打开。

tell application "System Events"
    set myFile to file "Macintosh HD:Users:velma:Desktop:Test.png"
    set myFolder to folder "Macintosh HD:Users:velma:Desktop:Test"

    --delete works! with both type “file/folder” and type “disk item”
    --delete myFile
    --delete myFolder

    --open works!
    open myFile
    open myFolder

    --move fails!
    move myFile to myFolder
end tell

在这种情况下,它返回的错误是“无法获取文件”,编号 -1728。

【讨论】:

  • 我怀疑有错误;如果您将代码放入 "Finder" 上下文中,则它可以工作(如我的回答)。
  • @ Jerry Stralton 我通常使用“set”来声明路径/字符串。改用“复制”有好处吗?否则我们有相同的思路
  • @TimJoe:copyset 之间的区别仅与 可变 对象有关(datelistrecordscript对象),所以在这种情况下它们是相同的。一般来说,除非你真的想复制数据(复制一个值),我推荐使用set - 见developer.apple.com/library/mac/documentation/AppleScript/…
  • @TimJoe 和 mklement0,使用“copy”而不是“set”是我尝试了几种不同的事情并最终在“copy”迭代中结束的结果,当时我意识到我无法解决原来的问题。我已经更新了示例,以免造成混淆。
  • 对我来说不是问题,我会使用“set”——只是不知道是否有理由使用我不知道的“copy”。我已经尝试了所有我能想到/找到并理解“最后一次尝试”代码的东西。 :P
【解决方案3】:

"System Events" 上下文中的move 命令中似乎存在错误OX 10.9(可能还有10.8)。

解决方法是改用"Finder" 上下文:

使用 HFS 样式 路径(分隔符为 :

set somefilepath to "Design_005_HD:Users:Design_005:Desktop:Start:TextFile.txt"
set somefolderpath to "Design_005_HD:Users:Design_005:Desktop:End:"

tell application "Finder"
    move file somefilepath to folder somefolderpath
end tell

使用 POSIX 风格 路径(分隔符为 /) - 与原始问题一样

set somefilepath to "/Users/Design_005/Desktop/Start/TextFile.txt"
set somefolderpath to "/Users/Design_005/Desktop/End"

# Note that we use `as POSIX file` even in the case of the *folder*
# - this works, however.
tell application "Finder"
    move somefilepath as POSIX file to somefolderpath as POSIX file
end tell

注意:

  • as POSIX fileboth 两种情况下都会返回 file 对象,但 Finder 仍然可以正确处理移动 - 可以将 POSIX file 与两个文件 一起使用文件夹
  • 请注意,使用POSIX file前缀 形式——例如POSIX file "/Library",仅适用于路径字符串literal;如果您尝试将路径字符串构建为表达式,它会中断(在“Finder”上下文中,但不在 AppleScript 上下文中(!)):POSIX file ("/" & "Library") - 相比之下,"/" & "Library" as POSIX file 有效(在两种上下文中) -去搞清楚。 为安全起见,请始终使用后缀形式:... as POSIX file
  • 使用as POSIX file 的一个缺点——至少从 OS X 10.9 开始——是 如果文件/文件夹不存在,则错误消息很神秘:你会看到 Finder got an error: Handler can’t handle objects of this class.Finder got an error: AppleEvent handler failed. - 都带有编号-10000
  • (将folder 直接与POSIX路径一起使用,如问题的早期版本 - 例如,folder "/Library" - 仅适用于"System Events"上下文,因此不是 "Finder" 上下文中的选项。)

至于 AppleScript OS X 10.9 的变化:

您看到的行为似乎是一个错误(另请参阅@Jerry Stratton 的回答); AppleScript release notes for 10.9 中没有任何内容表明该区域发生了变化。

我现在认为这个问题也会影响 OS X 10.8。

我鼓励您通过 http://bugreport.apple.com 向 Apple 提交错误报告,我已经这样做了。

可悲的是,在 AppleScript 中处理文件、文件夹和别名一直是一团糟,混淆源于不同字典(AppleScript 本身、系统事件、Finder)中的同名类具有细微的不同行为。

一般建议:对于文件系统操作,使用tell application "Finder" 上下文

"System Events" 字典,在其磁盘文件夹文件套件中,重复 Finder 的一些文件系统操作功能,但只有一些 - 一个奇怪的遗漏是例如,一个文件 copy 命令。

【讨论】:

  • 我在 10.8 中没有任何问题,或者如果我仍然让它按预期工作。
  • @TimJoe:使用您问题中的当前代码在 10.8 上重试。当我这样做时,在 10.8.5 上,我得到 System Events got an error: Can’t get file \"<HFS path>\"." number -1728 from file "<HFS path>" - 就像我在 10.9.2 上所做的一样。请注意,错误消息和编号与您在问题中报告的不同。
  • 老实说,这是一篇文章,旨在了解为什么我的脚本不再喜欢移动文件的系统事件。 @mklement0 我使用的东西看起来像这样- ¬将 Somefilepath 设置为((到桌面的路径)作为字符串)&“开始:TextFile.txt” ¬将 somefolderpath 设置为((到桌面的路径)作为字符串)&“结束:” ¬ ¬告诉应用程序“系统事件”¬将文件(Somefilepath)移动到(somefolderpath)¬end告诉我为什么我需要删除术语文件夹,但它适用于10.8.5。添加文件夹会给我错误 1728
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多