我正在使用Applescript处理产品安装程序的部分工作。我使用同一脚本多年没有遇到任何麻烦,但是最近有一些用户报告说该脚本无法自动清除,从而导致出现问题。我无法在我的系统上重新创建它,所以想知道你们中的任何人是否可以阐明为什么在某些系统上会发生这种情况。
安装程序是* .pkg文件。安装程序在用户的主目录中创建一个名为 Contents 的文件夹,其中包含有效载荷(一个或多个包含* .pyc和* .txt文件的文件夹)以及Applescript,然后调用如下所示的Shell脚本所以:
#!/bin/sh
open "$2/Contents/Live AutoConfig.app"
exit 0
AutoConfig.app 是已编译的Applescript。它将 Contents 中的有效负载传输到Applications内多个* .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上运行安装程序。
关于为什么会发生这种情况的任何想法?
答案 0 :(得分:1)
这不是直接解决您的问题的方法。隔离问题的一个好开始是将代码包装在“ try”和“ on error”语句内。这样,当代码遇到错误时,您可以让错误处理程序显示警报,或者实际上创建脚本错误日志文件,其中包含有关导致错误的原因的一些信息。我个人喜欢让AppleScript创建脚本错误日志文件,特别是因为它在具有不同macOS版本的几台不同机器上运行。一台计算机上的代码失败原因与另一台计算机上的代码失败原因完全可能。一个人可能会追逐他们的尾巴几个小时,而只是发现该修复程序只能在一台计算机上工作,而不能在其他计算机上工作。
我有一个基本的try / error例程,它将在用户桌面上创建脚本错误日志文件。只需将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”子句来解决已经具有“目录”文件夹的计算机,因为这些文件夹没有从上次安装中删除。如果该文件夹仍然存在,则在运行代码的调试版本时,可能会导致错误。因此,您可能要考虑将以下代码添加到脚本的开头,以解决该可能的问题
set contentsFolder to (path to home folder as text) & "Contents"
tell application "Finder"
if folder contentsFolder exists then delete folder contentsFolder
end tell