2010年6月13日 星期日

用 Applescript 寫 Droplet

前幾天我看到 PTT Mac 上有篇文章在問大量修改檔案權限的方法,讓我技癢想來用 Applescript 寫寫看 [1]。修改權限的方法很簡單,檔案權限這種東西是基於 Unix-like 系統,所以只能下 shell command 去改,而這指令也很常見,就是 chmod。不過這個倒沒什麼,重要的是如何一次處理大量的檔案

其實解決這個問題最直覺的方法就是用 Automator,這東西可說是 Apple 送使用者的禮物,有哪個作業系統廠商肯花時間將自己 OS 的 scripting language GUI 化,然後包裝成這麼精緻的 IDE ? [2] Windows 上的 Batch 檔及 BSD/Linux 上的 Shell script 我到現在還是不太會寫,而當然不可能有 GUI 化的 IDE,不過這跟 Applescript 的特性有關,能夠控制其他 GUI 軟體及系統介面的 script 語言真的是絕無僅有,去年紅翻天的 Sikuli 算是另一個例子。不過 Automator 老早就做得更好,雖然作者是 Mac user,但是他這個專案其實主要是造福非 Mac user 的族群。  :P

可是 Automator 也不是沒有缺點,第一個是裡面的動作 (Action) 選項中常常有好幾個模稜兩可 (例如 Finder 裡的一些動作),有時真的不知道怎麼選,註解也寫得看不出分別,容易讓使用者感到很困惑;第二就是慢 ! Automator 輸出出來的工作流程 (workflow)、應用程式 (app) 都跑得比一般的程式來得慢,這是因為運行時要先經過 Automator 的處理。所以我一直認為 Automator 的目的是為了給使用者方便,快速跟效能並不是它的強項,故我這次不使用它。

回到最初的問題,若不用 Automator,那該怎麼用 Applescript 完成 ? 我打算用 Script Editor 寫一個簡單的 droplet 即可。droplet 是 Mac OSX 裡一種特殊的應用程式類型,它其實就是 script,可是是依靠將其它檔案拖放到它的圖示上才啟動,用 Automator 可輕易寫出 droplet,但是這次我不用它,自己寫比較可以了解程式碼在幹嘛,而且成品的運行效能也比 Automator 輸出的好。droplet 的圖示及該程式碼如下 : (以 chmod -R 644 指令為例)

on open theFiles
      repeat with theItem in theFile     
             set itemPath to quoted form of POSIX path of (theItem as string)
             do shell script "chmod -R 644 " & itemPath user name "XXX" password "YYY" with administrator privileges
      end repeat
end open

這個 droplet 的寫法出奇地簡單,要點如下 :
1. handler 開頭使用關鍵字 "open" 即可讓程式變身成 droplet,輸入進去的檔案 "們" 會以 list 的方式呈現 (theFile),藉由取出每一個項目 (theItem),以 repeat 去反覆執行更改權限的指令。
2. droplet 輸入進來的檔案是使用 Mac-styled path,所以必須轉換成 POSIX path 以應付 shell command 的需求,不知道這些路徑名稱的人可以看一下這篇
3. POSIX path 前要加上 quoted form 以應付路徑中裡有特殊字元的檔案 (例如空白字元)。
4. Applescript 使用 do shell script 來執行 shell command,但是遇到需要使用者權限的指令不能直接打 sudo,必須使用 user name "XXX" password "YYY" with administrator privileges,裡面的 XXX 是管理者帳號,YYY 是管理者密碼。

此回文一發出,果然有高手提出使用 shell command 單行解決的方法 (用 wildcard characters 或 find 指令去搜尋),但是對於我這種已經習慣 Applescript 語法的人,真的覺得 shell script 的寫法簡直是給鬼看的 ..... Applescript 的語法真的是誇張地平易近人 [3],我想在我有限的時間裡,還是會先鑽研 Applescript 的寫法吧 !

對於大部分的使用來說,Mac OSX 是好在漂亮的圖形介面。但是對我或一些 scripter 來說,Mac OSX 的好是因為有 Applescript !!!


附註
1. 本來以為會有很多高手回答,沒想到回答的人出奇地少,因為那個問題分兩部份,第一是如何更改檔案權限,第二是如何批次處理,沒想到回答的人都只針對第一部分 ....
2. 我知道 Automator 不算是 IDE,但在這裡我還是這麼稱呼它,因為我覺得在很多地方很類似,甚至有些地方 Automator 還做得更好 (比如說不輸出直接執行,以及輸出成右鍵選單)。
3.  其實 Applescript 這種類似英文的語法才是少見的,大部分的程式語言都是不知道在寫啥鬼,所以我蠻佩服發明這個語言的人,連程式語言都可以做得淺顯易懂。Sikuli 的作者 vgod 就是認為雖然科技進步了這麼多,程式語言居然一直沒什麼改變,讓一般人沒辦法寫簡單的程式,所以他才有了動力去開發 Sikuli。不過就如我以前的文章,其實 Apple 早就在 Applescript 及 Automator 上下功夫,只是 vgod 覺得不夠好用或是不能跨平台 (?),再加上他個人的研究領域,因此他才自己開發一個更新奇有趣的程式寫法,不管如何,這都是好事。 :)

沒有留言:

張貼留言