iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Software Development

妄想對自己的Windows優化兼Debug的工程師很正常吧系列 第 14

REG檔撰寫—登錄檔腳本其實不難

今天要來介紹的是.reg文件的寫法,要實作前請記得先做好備份喔!
這是當作給自己最後的作業,對登錄檔有熟悉感後,要學會寫.reg文件才算合格,其實這份文件也不難所以就用一篇的時間來研究這部分吧。


寫.reg文件的好處

其實還有像是使用命令提示字元的REG指令,或是一些程式可以嵌入修改的函式等等方法,我們暫時不討論這部分,寫.reg檔是最快速方便的方法,他比起cmd指令可以一次整合指令好閱讀,而我們也不是寫什麼軟體需要在程式中更改登錄檔,學會這項技能可以看懂匯出的備份檔,也可以轉移檔案隨處隨用,甚至算是一個簡單的急救方法,因為常常有人誤刪登錄檔(例如刪除HKEY_CLASSES_ROOT.exe子鍵,這會失去.exe檔的開啟方式連結,造成.exe檔無法找到開啟方式),最後發生regedit.exe打不開無法改回登錄檔的情況,這個時候寫一份.reg文件執行他就可以了回復了。


範例

所謂.reg文件大概長下列這樣,下面是當我把HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System子鍵匯出備份的樣子。
Imgur


格式及語法

微軟官方則給出這樣的公式,我們用這張來說明簡單的語法標示:
Imgur

  • RegistryEditorVersion:宣告你的登錄編輯程式版本,通常Win 10都是5.0,所以第一行我們會寫:Windows Registry Editor Version 5.00。
  • Blank line:這個是空行,會被當作新登錄路徑的開頭,我們每次要操作一個子鍵時就要空一行代表切換目錄
  • [RegistryPath]:會接在空行之後,宣告下個要操作的登錄檔路徑,需要加上中括號標示,如果寫的路徑不存在則會依照你指定的路徑建立新的子鍵。
  • “DataItemName”:這是指定登錄值的名稱,需要用雙引號括住,如果沒有這個登錄值一樣會直接建立在目前指定的路徑上,後面寫等號繼續指定內容,如果要指定預設值,則用@取代,不加雙引號。
  • DataType:DataValue:這裡就是指定登錄值的資料類型跟資料本身,中間要用冒號相隔。二進位資料要用十六進位表示,中間用逗號隔開。但如果是REG_SZ類型,則直接寫”DataValue”,需要加上雙引號,不標示類型及冒號,其資料遇到反斜線()要用雙反斜線(\)表示,遇到雙引號(“)需要用跳脫字元反斜線雙引號(\”)表示。
  • 各種DataType的指定:
    • REG_SZ:不用寫也不用加冒號
    • REG_MULTI_SZ:hexadecimal(7)或hex(7)
    • REG_EXPAND_SZ:hexadecimal(2)或hex(2)
    • REG_BINARY:hexadecimal或hex或hex(3)
    • REG_DWORD:dword
    • REG_QWORD:hex(b)

註解可以在句首使用分號(;),整行即被視為註解。
整份文件寫完最後應該留下一條空行(Blank line)。
REG_SZ類型也可以用hex(1)表示,但值需要用UTF-16LE表示,並用NUL結尾。而其實上述的hex值括號內的數字是各種資料類型的Type ID。
Imgur


實作測試-新增及修改

看完基礎的解說後,我們現在應該能做到新增和修改登錄值,往下我們在HKEY_CURRENT_USER\Control Panel\Desktop子鍵下測試看看。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Desktop\Test1]
;這是註解1

[HKEY_CURRENT_USER\Control Panel\Desktop\Test2\Test22]
@="qwertyuiop"
"@"="qwertyuiop"
;這是註解2
"Test2Code1"=dword:00000010
"Test2Code2"=""
"Test2Code3"="test\\test\"test"
;這是註解3
  • 註解1:本來沒有Test1這個子鍵,所以這行會建立它,然後下面沒有給登錄值所以只會看到數值未設定的REG_SZ預設值。
    Imgur

  • 註解2:@可以設定預設值,但是加上雙引號則會視為登錄值名稱。

  • 註解3:直接往下接兩個新子鍵也是可以的建立的,dword的給值會視為16進位,字串值為空時可直接打雙引號,反斜線和引號也可以標示。
    Imgur

如果要修改登錄值直接寫就會覆蓋掉原本的值,我們拿剛建立的Test22子鍵來測試看看:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Desktop\Test2\Test22]
"Test2Code1"=dword:000000a3
;這是註解1
"Test2Code2"=dword:00000011
;這是註解2
"Test2Code3"="aaaa"
"Test2Code3"="bbbb"
;這是註解3
"Test2Code4"=hex(2):61,00,62,00,63,00,00,00
;這是註解4
"Test2Code5"="我是字串"
;這是註解5
  • 註解1:數值可以覆蓋修改
  • 註解2:指定存在的登錄檔名稱也可以修改他的資料類型
  • 註解3:登錄值名稱相同的話以最後一次存取為準
  • 註解4:這裡要用UTF-16LE的方式編碼,結尾通常會補上00,00
  • 註解5:中文字有些編碼問題會出錯,在存檔時使用UTF-16LE with BOM就可以正常寫入
    Imgur

更改存檔編碼為UTF-16LE with BOM後,中文可正常顯示:
Imgur


刪除登錄值

如果要刪除分支(子鍵及子鍵內的一切),直接在DataItemName的中括號內的開頭補上連字符(-),例如:[-HKEY_CURRENT_USER\Control Panel\Desktop\Test1],整個子鍵就會被刪除

如果要刪除各別登錄值,則直接在等號後接上連字符(-),如果要刪除預設值的內容,也就是恢復數值未設定的狀態就直接打@=-

如果要重新命名登錄值或是子鍵,作法就是刪除他再建立新的。
下面給些範例:

Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\Control Panel\Desktop\Test1]

[HKEY_CURRENT_USER\Control Panel\Desktop\Test2\Test22]
@=-
;這是註解1
"Test2Code2"=-
;這是註解2
"Test2Code3"=-
;這是註解3

Imgur

以上就是.reg文件寫法的基礎介紹,遇到不會寫的也可以匯出類似的登錄值,比對看看就大概看懂了,因為這份文件的格式不難,學會寫以後也多了一項奇怪的技能可以炫耀哈哈。

而且寫到這裡你可能會發現一件事,當我們把登錄檔匯出成.reg檔作為備份的時候,我們不能預測之後會新增什麼登錄檔,所以備份裡沒有刪除的指令,還原的時候新增過的登錄檔並不會刪除只會複寫舊的登錄檔,所以這樣的還原不完全,用系統還原點才會比較完整。

現在我們已經熟悉登錄檔的意義和操作原理,下篇我們會從軟體的安裝和反安裝來看程式對系統的讀寫操作,不只對登錄檔,還有各種大小文件的連結關係,對系統穩定性的影響。

Imgur

參考資料:
https://forum.gamer.com.tw/C.php?bsn=60030&snA=528832
https://en.wikipedia.org/wiki/Windows_Registry
https://support.microsoft.com/en-us/topic/how-to-add-modify-or-delete-registry-subkeys-and-values-by-using-a-reg-file-9c7f37cf-a5e9-e1cd-c4fa-2a26218a1a23
https://www.twblogs.net/a/5d6d014ebd9eee5327ff0639


上一篇
登錄檔進階清理與重組--什麼是有必要的整理
下一篇
安裝與反安裝--軟體的彼得定律對系統的意義
系列文
妄想對自己的Windows優化兼Debug的工程師很正常吧30

尚未有邦友留言

立即登入留言