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


<<:  【Day 10】分类(Classification)(上)

>>:  Day 08: Creational patterns - Builder

# Day 20 High Memory Handling

今天直奔新主题!XDD 昨天提要 trace 的程序码,trace 的不多,今天就还是先来看个文件,...

[Angular] Forms - Reactive Forms

前言 Reactive forms提供了一种model-driven的方法来处理表单中会随时间变化的...

新新新手阅读 Angular 文件 - Add Service(2) - Day09

学习目标 这一篇是纪录阅读官方文件 Add services 的笔记内容。 本篇的内容是接续 Day...

Day7:CoroutineScope:launch() 以及 async()

在前一篇文章我们知道 suspend 函式必须要在 Coroutine scope 里面才能执行,本...

Day 21:「爸爸说,家里要重新装潢了」- 关於样式的属性绑定讲解

兔女鹅: 「爸爸,兔兔昨天讲的好难」 「有一大堆东西要记起来,要学不动了 QQ」 兔跋: 「一定是...