擴充彈性十足的檔案管理工具:Multi Commander

檔案管理員最多人使用的應該是Total Commander,我則是使用FreeCommander多年,FreeCommander提供的自訂命令是我常使用的功能之一,例如在選取檔案後用FastCopy來快速複製檔案。但最近的FreeCommander XE版本我在使用上卻有個嚴重問題:存取網路資料夾的速度經常突然變慢,有時需要等待十數秒、甚至數十秒才能再度操作,當我頻感不耐之際,剛好看到小眾軟件這篇Multi Commander – 快速进化、功能强大的文件管理器介紹Multi Commander,下載試用後為它的擴充功能大為驚豔,Multi Commander內建可撰寫腳本碼的MultiScript引擎,只要稍具JavaScript知識,就能依需求擴建功能。這會不會太方便了?或許原本需要撰寫程式才能處理的檔案操作,都能簡單的利用MultiScript就能完成。本文就針對Multi Commander的MultiScript部份做個簡單介紹。

建立新的自訂命令

要建立擴充的使用者自訂命令只要點擊功能表【Configuration】→【User Defined Commands】,按〔New〕就能新增命令,命令的類型有Internal Command、External、Custom Commands、Batch Script(.BAT)與Multi-Script五大類,選用Multi-Script後就能在右方的輸入框裡輸入腳本程式。

mc-script01

指定執行命令的方式

在Multi Commander裡我們必須以下列三種設定之一來指定如何執行自訂命令:

  1. Hotkey(熱鍵):指定按鍵給自訂命令,在【Hotkey】欄位裡按下按鍵後再按右方的〔Assign〕就可指定該按鍵執行自訂命令。如果按鍵已經被指定過則會出現衝突(Conflict)的錯誤訊息。
    mc-script02
  2. Menu(自訂功能表):按Add Menu後點選自訂命令後再按〔--->〕將之加入功能表裡,新建的功能選項會變成功能表的最後一項。
    mc-script03
  3. Alias(代名):給自訂命令一個代名,可以在功能表下方的【Address】分頁下方的命令輸入區輸入代名來執行。
    mc-script04

MultiScript的撰寫要點

MultiScript其實很好寫,只要你寫過JavaScript或xxxScript,稍微閱讀語法說明應該很快就能上手。以下是我撰寫、測試後的幾個要點提示:

  • MultiScript區分大小寫
  • 變數宣告使用@var,變數名稱必須以 $ 開頭,只能使用a-z、A-Z、0-9等幾個符號
  • 變數的宣告最好一行一個
  • 區塊開始與結束的 {、} 符號要寫在獨立一行,不要跟在其他敘述的後面
  • 字串的比較不要用==運算式,要用 StrIsEqualNoCase( ),而且最後把比較的值先指派給變數,再使用該變數來比較,例如:
  @var $needRename = StrIsEqualNoCase($file, $sNewName);
  if ($needRename == 0)  // 檔名不同需要改名
  {
    // ...
  }
  
  • 除錯可以用下列兩個函數:
    1. 彈出對話窗:MessageBox("標題", 數值變數, 1);、MessageBox("標題", 字串變數, 1);
    2. 輸出訊息到Log檔:用LogAppInfo(字串); 輸出偵錯訊息,腳本執行時的錯誤訊息也會自行輸出到「日期-MultiCommander.log」;Log檔由功能表【Help】→【Go to...】→【Log folder】可以開啟

MultiScript範例

剛好有個變更照片檔名的需求,說明狀況如下:

  • 平常iPhone 4S拍攝的照片檔是使用Dropbox App的Upload上傳再同步到筆電
    • 上傳後的檔名格式是:「Photo YY-M-D h mm ss.jpg」,小於10的月份、日期與小時只會有一位數,不會左補零
    • 例如:「Photo 12-4-27 9 23 45.jpg」
  • 要把iPhone 4S內的檔案重新拷貝到電腦,用連接線連好直接拷貝:
    • 檔案格式是「IMG_序號.jpg」
    • 先用改名工具Ant Renamer,以「Use EXIF info」的方式+「Photo %datetime%%ext%」格式變更檔名,%datetime%取得的日期格式是「YYYY-MM-DD hh-mm-ss」,例如:「Photo 2012-04-27 09-23-45.jpg」
    • 再以Ant Renamer的「取代多重字串」,將「Photo 2012」修改成「Photo 12」
  • 建立MultiScript如下,簡單說明重點:
    • 以GetSelectedPaths( )取出選取了的檔案完整路徑名,傳回陣列
    • 以arrayCount( )找出選取了的檔案個數(上述陣列的元素個數),進入for-loop,逐一變更檔名
    • 變更檔名的邏輯寫在newName( ):
    1. 用StrSplit( )將檔名以空白分割成數個元素,傳回陣列
    2. 將月份、日期、小時的 0 去掉,時間的分隔字元由 "-" 變成空白
    • 最後以內部命令MC.Filesystem.Rename變更檔名
 
function newName($sFileName) 
{
  @var $aTokens;
  @var $sHour;
  @var $sResult;
  @var $sToken;
  @var $iLen;
  @var $iTokens;
  @var $i;
  
  $sResult = "";
  $aTokens = StrSplit($sFileName, " ");
  $iTokens = arrayCount($aTokens);
  for ($i=0; $i < $iTokens; $i++)
  {
     $sToken = $aTokens[$i];
     if ($i == 1)  // yy-mm-dd
     {
       @var $aTokens2 = StrSplit($sToken, "-");
       @var $j;
       $sToken = "";
       for ($j=0; $j < 3; $j++)
       {
         @var $sToken2;
         $sToken2 = $aTokens2[$j];
         @var $iValue = strtonum($sToken2);
         if ($iValue <= 9)
         {
           $sToken2 = numtostr($iValue);
         }
         $sToken = $sToken + $sToken2;
         if ($j  < 2) 
           $sToken += "-";
       }
     }
     if ($i == 2)  // hh-mm-ss
     {
        @var $sFirstChar;
        $sFirstChar = StrSub($sToken, 0, 1);
        @var $iFirstChar = strtonum($sFirstChar);
        if ($iFirstChar == 0)  // true, the first char is zero
        {
          $sToken = StrSub($sToken, 1, -1); 
        }
        
        $sToken = StrReplace($sToken, " ", "-");
     }
     $sResult = $sResult + $sToken+ " ";
  }
  return $sResult;
}

@var $aFiles = GetSelectedPaths();
@var $sTargetPath = GetTargetPath();
@var $iCount = arrayCount($aFiles);
@var $i;
@var $j;
@var $sFileName;
@var $aTokens;
@var $iTokens;
@var $sToken;
@var $sNewName;

for ($i=0; $i < $iCount; $i++) 
{
  $sFileName = $aFiles[$i];
  LogAppInfo("filename=" + $sFileName);
  $sNewName = newName($sFileName);
  @var $needRename = StrIsEqualNoCase($sFileName, $sNewName);
  if ($needRename == 0)
  {
    @var $iPos = StrFind($sNewName, "\\Photo ", 0);
    if ($iPos > 0)
    {
      $sNewName = StrSub($sNewName, $iPos+1, -1);
      LogAppInfo("source=" + $sFileName + ", new=" + $sTargetPath ^ $sNewName);
      MC.Filesystem.Rename FILE="{$sFileName}" NEWNAME="{$sNewName}";
    }
  }
}
  
  • 最後執行Multi Commander,瀏覽照片資料夾後,選取所有的檔案再執行自訂命令

我想應該還會有很多功能可以透過MultiScript來自行擴充的。Multi Commander雖然比較「年輕」,但看起來架構比較有彈性,作者更新得速度還滿快的,應該會是一套可以拭目以待的軟體。

Multi Commander資訊

2018/03/05 YouTube教學影片:雙面板多頁籤的檔案管理工具 Multi Commander 的使用技巧


##

您可能也會有興趣的類似文章

簡睿

服務於軟體業的資訊老兵。興趣廣泛,學習力佳,樂於分享所知所學。

您可能也會喜歡…

2 個回應

  1. Vincent表示:

    簡睿用的 FCXE 版號是多少? 網路資料夾會變慢的問題似乎已在 570 版之後解決, 僅供參考。

    • 簡睿表示:

      我有donate FreeCommander XE,目前手邊的版本是0.0.0.584。後面的版本有加了幾個選項設定,但在我家裡的環境裡沒什麼效用哩…

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *