4

我正在创建一个applescript,它在Mac Os X 中创建/Users 文件夹的备份图像。我想做以下两件事之一:

  1. 在 shell 脚本运行时显示理发杆进度条,并带有退出选项。
  2. 在脚本运行时显示一个对话框,并带有退出选项。

我曾尝试使用 /dev/null 执行 shell 脚本,但这会忽略所有输出。我想保存输出并将其显示在用户的对话框中。

这是我的代码:

set computername to (do shell script "networksetup -getcomputername")
set fin to ""
set theIcon to note
tell application "Finder"
    try
        set folderalias to "/Users"
        set foldersize to physical size of folder (alias ":Users") --(info for folderalias) 
        set foldersize to (round ((foldersize / 1.0E+9) * 100)) / 100
    on error
        tell application "System Events"
            set foldersize to (round (((get physical size of folder ":Users" as text) / 1.0E+9) * 100)) / 100
        end tell
    end try
end tell

display dialog "User profile backup utility" & return & return & ¬
    "The computer name is: " & computername & return & return & ¬
    "The '/Users/' directory size is: " & "~" & foldersize & " GB" & return & return & ¬
    "Would you like to backup the '/User' directory now?" & return ¬
    buttons {"Cancel", "Backup Now"} default button "Backup Now"
set comd to "hdiutil create ~/Desktop/" & computername & ".dmg -srcfolder /test/"
set fin to do shell script (comd) with administrator privileges
display dialog fin
4

2 回答 2

5

使用板载 AppleScript(即Standard Additions)无法显示进度条对话框,但这可以使用Shane Stanley 的ASObjC Runner来实现,这是一个可编写脚本的不露面后台应用程序,它提供了许多有用的功能,一组与进度对话框相关的命令。下载到您的系统后,

tell application "ASObjC Runner"
    reset progress
    set properties of progress window to {button title:"Abort Backup", button visible:true, message:"Backing up the '" & (POSIX path of folderalias) & "' directory.", detail:"There are " & foldersize & " GB of data to backup – this might take some time.", indeterminate:true}
    activate
    show progress
end tell
try -- to make sure we destroy the dialog even if the script error out
    <your backup operation here>
end try   
tell application "ASObjC Runner" to hide progress

将在备份操作运行时显示一个不确定的进度条(或“理发杆”)——至少如果它是同步的(就像从 AS 调用的 shell 命令一样)。至于你的 shell 命令的输出,它是由do shell script命令自动返回的——在你的代码中,它被分配给[从ASObjC Runner 文档fin中或多或少地批量提升的代码]。

ASObjC Runner可以嵌入到 AppleScript 应用程序中(将脚本保存为AppleScript Editor中的应用程序),方法是将其放入捆绑包的Resources文件夹(在 Finder 中,在上下文菜单中选择Show Package Contents)并使用path to resource命令在using terms from内调用它– 我在上面链接的文档包含详细信息和示例代码,但至关重要的是,它包含一个严重错误:您的tell语句需要使用资源包( tell application (POSIX path of (path to resource "ASObjC Runner.app"))) 的 POSIX 路径。

关于您的代码的几点说明:

  • 有一种更优雅的方式来获取/Users文件夹的别名:

    path to users folder
    

    – 无需硬连线和调用Finder。然后,您可以使用POSIX path of,或者,如果您需要引用它,则可以获取到它的 shell 兼容路径quoted form of POSIX path of

  • 我建议仅使用系统事件来获取physical size- 与Finder不同,它在后台工作。这将允许你摆脱tell application "Finder"andtry … catch块(不确定你想通过那个来实现什么——如果你对 有反应error -10004,那是因为round不喜欢被放在一个tell块内)。
  • 无需初始化fin为空字符串 - 您将从do shell script.
  • 说到你的do shell script,你需要引用它的computerName变量,它将在该名称中的空格处中断。
  • theIcon从未使用过。
  • 您可能希望使用display alert而不是display dialog用于用户确认,因为它很好地强调了消息的第一部分。
  • 代码中有很多不必要的括号——AppleScript 需要其中一些来分隔语义命令块,但不是全部......</li>

总之,您的代码可以修改为:

set computerName to do shell script "networksetup -getcomputername"
set folderAlias to path to users folder
tell application "System Events" to set folderSize to physical size of folderAlias
set folderSize to round(folderSize / 1.0E+9 * 100) / 100

display alert "User profile backup utility" message ¬
  "The computer name is: " & computerName & return & return & ¬
  "The '" & (POSIX path of folderAlias) & "' directory size is: " & "~" & folderSize & " GB" & return & return & ¬
  "Would you like to backup the '" & (POSIX path of folderAlias) & "' directory now?" & return ¬
  buttons {"Cancel", "Backup Now"} default button "Backup Now"
set shellCmd to "hdiutil create ~/Desktop/'" & computerName & "'.dmg -srcfolder /test/"
-- progress bar dialog display initialization goes here
try
    set shellOutput to do shell script shellCmd with administrator privileges
end try
-- progress bar dialog hiding goes here
display dialog shellOutput
于 2012-05-10T12:30:39.853 回答
1

虽然不如 kopischke 的建议漂亮,但获取进度信息的一种快速而肮脏的方法是在终端本身中运行命令。

set comd to "hdiutil create -puppetstrings '~/Desktop/" & computername & ".dmg' -srcfolder '/test/'"
tell application "Terminal" to do script comd
于 2012-05-10T17:59:19.853 回答