Applescript Shell脚本进展

时间:2012-05-10 01:06:55

标签: shell applescript progress

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

  1. 在shell脚本运行时显示理发杆进度条,并选择退出。
  2. 在脚本运行时显示一个对话框,其中包含退出选项。
  3. 我尝试使用/ 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
    

2 个答案:

答案 0 :(得分:5)

使用板载AppleScript(即标准添加)无法显示进度条对话框,但这可以使用Shane Stanley’s 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命令自动返回 - 在您的代码中,它被分配给fin [代码从ASObjC Runner documentation或多或少批量提升]

ASObjC Runner 可以嵌入到AppleScript应用程序中(将脚本保存为 AppleScript Editor 中的应用程序),方法是将其放入包的Resources文件夹中(在Finder中,在上下文菜单中选择显示包内容并使用path to resource commandusing terms from block内调用它 - 我上面链接的文档包含详细信息和示例代码,但是,至关重要的是,包含一个严重错误:您的tell声明needs to use the POSIX path to the Resources bundletell application (POSIX path of (path to resource "ASObjC Runner.app")))。

关于您的代码的一些评论:

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

    path to users folder
    

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

  • 我建议仅使用系统事件来获取physical size - 与 Finder 不同,它在后台运行。这样你就可以摆脱tell application "Finder"try … catch块(不知道那个你想要实现的目标 - 如果你对error -10004作出反应,那是因为{{ 1}}不喜欢被放在round区块内。
  • 无需将tell初始化为空字符串 - 您将从fin获得返回值。
  • 说到你的do shell script,你需要引用它的do shell script变量将以该名称中的空格中断。
  • computerName从未使用过。
  • 您可能希望使用theIcon代替display alert进行用户确认,因为它非常强调邮件的第一部分。
  • 代码中有许多不必要的括号 - AppleScript需要其中一些来分隔语义命令块,但不是所有这些括号......

一起意味着您的代码可以修改为:

display dialog

答案 1 :(得分:1)

虽然不像kopischke的建议那么漂亮,但获取进度信息的快捷方式是在终端本身运行命令。

set comd to "hdiutil create -puppetstrings '~/Desktop/" & computername & ".dmg' -srcfolder '/test/'"
tell application "Terminal" to do script comd