Matrix 精選

Matrix 是少數派的寫作社區,我們主張分享真實的產品體驗,有實用價值的經驗與思考。我們會不定期挑選 Matrix 最優質的文章,展示來自用戶的最真實的體驗和觀點。

文章代表作者個人觀點,少數派僅對標題和排版略作修改。

Windows 平臺有不少好用的命令行工具,許多有 UI 的軟件也能在終端中被調用。我常常用它們來做一些輕量重複的文件處理工作。但久而久之,我開始厭煩每次輸入一樣的命令和參數,點擊文件右鍵解壓的操作給了我靈感, 能不能將命令行工具寫入右鍵,實現點擊文件右鍵即可移動備份文件、壓縮上傳圖片 呢?

實現原理

註冊表之於 Windows 系統,就像 ini、json 文件之於一些軟件,是 Windows 平臺的高級「控制面板」。註冊表中 HKEY_CLASSES_ROOT (HKCR) 控制着文件和文件夾的打開方式、類型以及與之相應的鼠標右鍵菜單。一個典型的控制右鍵菜單的 HKCR 目錄如下圖所示:

文件目錄結構

「.xxx」的項是後綴名,它的「默認」鍵值指向一個與鍵值同名的項,在這個項的 shell 目錄下,就是點擊該類文件會出現的一部分右鍵菜單。因此,只需要在某一類型文件的 shell 目錄下寫入自定義命令,就能改造系統右鍵菜單。

案例一:將安裝包文件備份到特定文件夾

我有把一些可能還會用到的安裝包備份到特定文件夾的習慣,可以用這個例子來說明如何定製特定類型的文件右鍵菜單。

所謂備份文件,說白了就是移動或者複製文件到某個文件夾,安裝包不需要保留在原文件夾,所以直接移動即可。在 PowerShell 中,可以使用 mi (Move-Item) 進行移動文件操作,移動安裝包到 D 盤的 exe 文件夾就是:

mi 安裝包路徑 D:\exe\

下面,需要找到安裝包文件對應的註冊表項。安裝包一般是以 .exe 或者 .msi 結尾,以 exe 爲例,在 HKEY_CLASSES_ROOT 下選擇 .exe 這個項,記下右側面板「默認」鍵的數據「exefile」,這是與之相關的文件夾名。

註冊表的 .exe 指向 exefile

然後,找到 exefile 文件夾,在其中的 shell 目錄下新建一個項,命名爲「備份」,如果不做其他設置,這個文件夾名就是右鍵菜單的名字。在「備份」下新建一個項「command」,用來儲存菜單對應的命令,注意大小寫,註冊表的鍵名對大小寫敏感。完成後,文件夾結構應該像這樣:

新建「備份」菜單

最後,點擊 command,修改右側面板中默認的數據,寫入

"powershell.exe" "mi %1 D:\exe"

第一個引號中是點擊菜單後打開的程序,一般需要寫完整的路徑,但 powershell 可以被系統直接調用(在環境變量路徑中),所以只用寫一個程序名。第二個引號內是參數,這裏寫入 powershell 要執行的命令,「%1」代表選中的文件路徑。如果某個命令內部沒有空格,引號也可以省略。確認無誤後,保存即可生效。效果展示:

單文件
多文件

案例二:轉換圖片格式、壓縮圖片

處理圖片類型文件,將它們壓縮、轉換格式是再常見不過的工作 了。這個案例將展示如何在註冊表中使用第三方命令行工具,以及如何處理多個類型文件。

我在 一行命令,搞定常見圖片、音頻、視頻、文本格式轉換 中簡要介紹了圖片處理工具 Magick 的安裝與使用, 要在右鍵中使用它,首先確保你已經正確安裝了該工具。以 Magick 轉換圖片爲 icon 圖標爲例,基本的命令應該是 magick 圖片路徑 圖片名.ico ,不過轉換之前還要處理兩個問題,其一, ico 格式轉換要求原圖片尺寸不能太大,因此在轉換前需要有選擇地對圖像進行縮放;其二,magick 有輸入輸出兩個參數,「圖片名」是個變量,註冊表「%1」是包含了後綴的文件名,因此還需要爲輸出文件設定一個單獨的變量,最終的命令是:

magick 圖片路徑 -set filename:name '%t' -resize '128x128>' 'C%[filename:name].ico'

-set 表示設定一個用作輸出文件名的變量,並用 %t (在 magick 中表示不帶後綴的圖片名)賦值, -resize '128x128> 表示當圖片尺寸大於 128x128 時,將原圖片縮小。假設原圖片文件是 256 x 256 的 sspai.png,那麼處理後的圖片就是 128 x 128 的 Csspai.ico。相較而言,壓縮圖片就簡單的多,只需要用 -quality 選項即可:

magick 圖片路徑 -quality 50 -set filename:name '%t' 'O%[filename:name].jpg'

接下來處理註冊表。因爲圖片格式實在太多,像案例一那樣在某個類型項中修改不太現實,我們不妨讓這些命令對所有文件都生效,這需要用到註冊表中 HKEY_CLASSES_ROOT 下的 * 項。另外,我打算把「轉換爲ico」、「壓縮圖片」這兩個命令作爲「圖片處理」的子菜單,方便查看和管理。參照第一個案例,首先在 * 的 shell 目錄建立這樣一個目錄結構:

圖片處理:目錄

爲了讓多級目錄生效,還需要在「圖片處理」添加一個名爲「SubCommands」的字符串值,告訴系統這是一個多級目錄,數據留空。

多級菜單

下面在「轉換爲 ico」的 command 目錄下寫入數據: "powershell.exe" "magick %1 -set filename:name '%%t' -resize '128x128>' 'C%%[filename:name].ico'" 在「壓縮圖片」的 command 目錄下寫入數據: "powershell.exe" "magick %1 -quality 50 -set filename:name '%%t' 'O%%[filename:name].jpg'" 這兩行命令和前面的不一樣:在每一個變量前面使用了兩個「%」,這是因爲在註冊表中,單個「%」會被解釋爲註冊表變量,而不是命令行參數,用兩次纔會向輸出一個「%」。保存後會立即生效:

效果

案例三:上傳圖片到圖牀

類似上傳圖片到圖牀之類的操作,我希望看到上傳進度,其返回值也需要記錄,因此需要小改下命令。

首先需要解決如何使用命令行實現上傳圖片的問題,我使用的是 picgo-core 工具。picgo-core 是 picgo 的命令行版本,客戶端擁有的功能它都有。可以使用 npm install picgo -g 全局安裝。至於配置、插件等使用問題,在這裏不多贅述,可以參考  官方文檔 ,網上相關教程也有很多。在寫入右鍵之前,將它調整得符合自己使用習慣,並且確保能在終端中直接調用。其上傳圖片到默認圖牀的命令爲:

picgo u 圖片路徑
上傳圖片

我們不妨繼續在「圖片處理」目錄下添加命令,按照案例二中的結構新建「上傳圖片」和「command」項。從上面的圖片演示中可以看到,picgo 會展示上傳進度,最後返回一個圖片的鏈接,我們需要複製這個鏈接。因此要讓 PowerShell 執行完命令後不退出,等待用戶下一步操作。實現 PowerShell 的等待只需要在命令後添加 -noexit 。在 command 的修改默認鍵值爲 powershell.exe -noexit picgo u %1

效果

美化和優化

基本功能設置完成後,還可以給菜單添加一點裝飾。以「圖片處理」菜單爲例,選中它,在右側面板添加字符串值,命名爲「icon」,在其「數據」中寫入圖標文件的路徑。這樣,菜單文字前就會顯示這個圖標:

菜單圖標

因爲案例中的命令都用了 PowerShell,所以在執行命令後,Powershell 會出現一段時間然後消失,如果不太喜歡,可以在 PowerShell 設置中調整窗口位置和大小。打開 Powershell,在其設置的「佈局」欄中勾掉「由系統定位窗口」,調整窗口位置和大小,把它放在角落。

放在角落

如果是多用戶,需要注意,通過修改 HKEY_CLASSES_ROOT 來添加右鍵菜單是對電腦中所有用戶生效的,相當於修改了系統的默認設置。HKCR 實際上是由 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 的 Software\Classes 兩部分混合(merge)而成。如果想要對單用戶生效,就要把以上操作在 HKEY_CURRENT_USER 中完成。

完工後,選中添加的項目,右鍵導出,更換環境之後可以雙擊導出的文件直接寫入註冊表,免去重新設置的麻煩。

重要提醒

  • 註冊表文件是系統的關鍵文件。 雖然文中涉及的添加項目操作並不會對系統穩定性產生影響,但是,如果不慎刪除或者修改了其他關鍵項目,將會產生難以挽回的後果
  • 系統自帶的註冊表編輯器並沒有「撤銷」的命令,一旦修改,就會立刻生效。
  • 建議首先 備份 相關注冊表,編輯時要儘量小心。
  • 另外,添加過多的右鍵項目可能會導致卡頓。如非必要,建議在某個特定文件類型下添加菜單。
  • 本文展示的是簡單的命令,複雜的操作仍然建議編寫腳本或者依靠有 UI 的軟件。

參考資料:

  1. 微軟給出的新建靜態右鍵菜單的說明
  2. 註冊表的作用
  3. Windows 對 HKCR 的定義
  4. Magick 的詳細用法和變量

> 下載少數派客戶端、關注少數派公衆號,瞭解更妙的數字生活 :leaves:

相關文章