2012-05-10 68 views
3

我创建,创建用户在Mac OS X系统文件夹/备份映像一个AppleScript我希望做两件事情之一:AppleScript的shell脚本进展

  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 
+0

如果我将shell脚本输出到/ dev/null并从shell脚本中获取PID,该怎么办?然后我可以用按钮杀死进程? 我该如何去做(如果可能)? –

+0

这完全是另外一个问题 - 不是让你失望,而是Stack Overflow,你希望不同的问题在字面上提出不同的问题,以便不把问题变成多问题的讨论主题。即使这些问题都与相同的代码有关:)。 – kopischke

+0

如果你问的话,你肯定会很开心的,顺便说一句 - 这是一个有趣的问题:)。 – kopischke

回答

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命令的输出,这是由do shell script命令自动返回的 - 在你的代码中,它被分配到fin [代码从ASObjC Runner documentation中或多或少地批量提取]。

ASObjC亚军可以嵌入到一个AppleScript应用程序通过将其放入包的Resources文件夹(在Finder中(你的脚本保存在的AppleScript编辑器的应用程序),在右键菜单中选择显示包内容 )并使用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兼容的路径,或者,如果您需要它,请参阅。

  • 我建议只使用系统事件得到physical size - 不像搜索,它在后台运行。这将允许你摆脱tell application "Finder"try … catch块(不知道你的意思是什么 - 无论如何 - 如果你对error -10004作出反应,那是因为round不喜欢放在tell块内)。
  • 无需将fin初始化为空字符串 - 您将从do shell script获得返回值。
  • 说到你的do shell script,你需要引用computerName变量,它会打破这个名字的空格。
  • theIcon从不使用。
  • 您可能想要使用display alert而不是display dialog作为用户确认,因为它非常强调消息的第一部分。
  • 有很多代码不必要的括号 - AppleScript的需要其中的一些界定语义命令块,但并不是所有的人...

总之意味着你可以修改代码来:

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 
+0

彻底的反应和对亚军的好建议! +1 – adayzdone

+0

感谢您的代码建议。它确实清理了一大笔钱。 我在很多机器上运行它,不想复制并运行每个应用程序上的ASObjC Runner应用程序。我只需要一个简单的方法来显示其工作状态,或者至少在工作时打开对话框。 –

+1

@JohnnyHieuLe:如果您将Apple * * ASObjC Runner *应用程序作为脚本应用程序进行分发,则可将其嵌入AppleScript中 - 应用程序的自述文件包含相关说明。另外,当通过“tell”调用时,它本身就会自行运行。如果你不想这样做,那么对于AppleScript而言,你运气不佳 - * Standard Additions *对话框都是阻塞的(即,在将流控制权交还给脚本之前,它们等待按钮点击)。 [看到这个问题](http://stackoverflow.com/questions/1068181/non-blocking-dialog-box-in-applescript) - 自那时以来情况并没有得到很大的改善。 – kopischke

0

虽然没有kopischke的建议那么漂亮,但获取进度信息的快速而肮脏的方法是在终端中运行命令。

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