【问题标题】:Deleting folders with Applescript doesn't work on some systems使用 Applescript 删除文件夹在某些系统上不起作用
【发布时间】:2019-02-27 01:03:52
【问题描述】:

我正在使用 Applescript 来处理我的产品安装程序的部分工作。多年来,我一直在使用相同的脚本而没有遇到任何问题,但最近有几个用户报告说该脚本没有自行清理,这会导致问题。我无法在我的系统上重新创建它,所以想知道你们中的任何人是否可以阐明为什么会在某些系统上发生这种情况。

安装程序是 *.pkg 文件。安装程序在用户的主目录中创建一个名为 Contents 的文件夹,其中包含有效负载(一个或多个包含 *.pyc 和 *.txt 文件的文件夹)以及 Applescript,然后调用一个看起来像所以:

#!/bin/sh

open "$2/Contents/Live AutoConfig.app"

exit 0

AutoConfig.app 是编译后的 Applescript。它将 Contents 中的有效负载传输到应用程序中多个 *.app 文件之一的内容中。这部分工作正常。在此传输结束时,脚本应删除 Contents 文件夹。这是行不通的。清理代码如下所示:

on clean_up()
    set temp_path to path to me
    tell application "Finder"
        set script_path to (container of temp_path) as Unicode text
        delete (script_path)
    end tell
end clean_up

当这不起作用时,没有错误消息或任何东西。 Contents 文件夹并没有按原样删除。而且,是的,我确定正在调用 clean_up。我觉得这很奇怪,因为从安全角度来看,我认为将文件传输到 *.apps 比从主目录中删除文件夹风险更大,但传输工作正常。很奇怪。

一些附加信息:安装程序和脚本是使用 10.5.8 创建的(FWIW,这似乎不是问题,因为安装程序在我运行 10.12.6 及更高版本的其他系统上仍然可以正常工作)。遇到此问题的用户正在 10.12.6 和 10.13.6 上运行安装程序。

关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 可能与您应用的辅助功能权限有关。您没有使用temporary items 等标准位置是否有特殊原因?
  • 如果这是一个可访问性问题,我认为它会影响整个脚本(特别是其中将文件传输到其他应用程序的部分),而不是仅影响其中的一部分。在相关说明中,我没有授予安装程序在我正在测试它们的系统上的任何特殊权限。
  • 至于temporary items,我不确定如何在 packagemaker 中使用它,但我会研究它。感谢您的建议!
  • 访问权限将与您的应用程序使用 Finder(苹果事件)有关 - 也许使用 shell 脚本直接删除临时文件夹?
  • 明白了。我可能应该提到我也在使用 Finder 进行传输。使用 shell 脚本进行删除是个好主意。我会试试看。

标签: applescript


【解决方案1】:

这不是您问题的直接解决方案。隔离问题的一个好的开始是将您的代码包装在“尝试”和“错误时”语句中。这样,当您的代码遇到错误时,您可以让该错误处理程序显示警报或实际创建一个脚本错误日志文件,其中包含有关导致错误的一些信息。让您的 AppleScript 创建脚本错误日志文件将是我个人的偏好,特别是因为它运行在具有不同版本 macOS 的多台不同机器上。完全有可能代码在一台计算机上失败的原因与在另一台计算机上失败的原因不同。一个人可能会追上几个小时,结果发现修复程序只在一台计算机上有效,而在其他计算机上无效。

我有一个基本的尝试/错误例程,它将创建一个脚本错误日志文件到用户的桌面。只需将 AutoConfig.app 中的 AppleScript 代码放在“try”例程中,然后重新编译并保存(确保保留原始 AutoConfig.app 的副本)并重新分发到触发错误的计算机。运气好的话,当他们再次尝试运行包安装程序时,他们的错误将被记录到他们的桌面

try

    -- INSERT YOUR CODE HERE

on error the error_message number the error_number
    set the error_text to "Error: " & the error_number & ". " & the error_message
        my write_error_log(the error_text)
end try

on write_error_log(this_error)
    set the error_log to ((path to desktop) as text) & "Script Error Log.txt"
    try
        open for access file the error_log with write permission
        write (this_error & return) to file the error_log starting at eof
        close access file the error_log
    on error
        try
            close access file the error_log
        end try
    end try
end write_error_log

您可能还需要添加几个“if...then”子句来处理已经具有“Contents”文件夹的计算机,因为这些文件夹并未从之前的安装中删除。如果该文件夹仍然存在,则在运行调试版本的代码时可能会导致错误。因此,您可能需要考虑将以下代码添加到脚本的开头以解决该可能的问题

set contentsFolder to (path to home folder as text) & "Contents"
tell application "Finder"
    if folder contentsFolder exists then delete folder contentsFolder
end tell

【讨论】:

  • 关于失败可能有不同的原因很重要。这是完美的 - 谢谢!
猜你喜欢
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多