2012-05-10 118 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