Windows Registry Editor Version 5.00
适用于Windows 2000、Windows XP和Windows Server 2003
或者REGEDIT4
适用于Windows 95、Windows 98和Windows NT 4.0。
Windows Registry Editor Version 5.00
还是需要声明版本6呢?在运行.bat文件时是否需要这样做?
要查看当前版本,请在“帮助”菜单中的“注册表编辑器”中单击“关于注册表编辑器”菜单项。
Windows Registry Editor Version 5.00
REGEDIT4
Windows Registry Editor Version 5.00
还是需要声明版本6呢?在批处理文件中,主要有两个标准应用程序用于处理Windows注册表:
reg /?
将显示可用操作。在控制台窗口中执行reg query /?
和reg add /?
将显示语法和选项,以获取(查询)或设置(添加)Windows注册表中的数据。Windows 2000(还有regedt32.exe)和之后的Windows版本都支持注册表文件的4和5两个格式。
Windows 95、98、Millennium和NT4仅支持格式为4的注册表文件。
因此,现在(2016年)主要取决于数据使用哪种格式来创建注册表文件。
主要区别是支持的编码文本数据。
格式为REGEDIT4的注册表文件只能是文本文件,每个字符占用1字节,使用Windows区域和语言设置中定义的代码页来处理非Unicode应用程序,对于北美和西欧国家而言,该代码页为Windows-1252。因此,格式为REGEDIT4的注册表文件不能包含代码值大于255(十进制,0xFF十六进制)的Unicode字符。
注册表文件采用格式Windows Registry Editor Version 5.00,支持按照Unicode标准使用每个字符多于1个字节的编码文本。因此,*.reg文件采用Windows Registry Editor Version 5.00格式由REGEDIT创建为UTF-16 Little Endian编码的文本文件,并带有Byte Order Mark (FF FE)。对于非ASCII字符,了解Windows命令解释器使用的代码页非常重要,因为通常它是OEM代码页,如代码页437(美国,加拿大)或代码页850(西欧),与GUI代码页Windows-1252不同。在命令提示窗口中运行chcp
或mode con
将输出当前计算机上Windows命令解释器用于控制台的默认代码页。
如果确实需要支持Unicode字符串,则需要使用格式Windows Registry Editor Version 5.00。
让我们看一个假想的Unicode示例:
在Windows注册表的键HKCU\RegFormat
下定义了两个Unicode字符串:
一个类型为REG_SZ
的字符串,名称为Two Not Equal 3
,Unicode字符串值为:
2 ≠ 3
一个类型为REG_MULTI_SZ
的多行字符串,名称为Formulas
,Unicode字符串值为:
2 µs × 3 = 6 µs
A = π × r²
有关注册表值类型的详细信息,请参见Microsoft文章Registry Value Types、Distributing Registry Changes和Data Types in the Registry。
导出键 HKCU\RegFormat
以格式 Windows Registry Editor Version 5.00,自 Windows 2000 起成为标准格式,导出结果为一个 UTF-16 LE 编码的文本文件,大小为 596 字节,内容如下:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"="2 ≠ 3"
"Formulas"=hex(7):32,00,20,00,b5,00,73,00,20,00,d7,00,20,00,33,00,20,00,3d,00,\
20,00,36,00,20,00,b5,00,73,00,00,00,41,00,20,00,3d,00,20,00,c0,03,20,00,d7,\
00,20,00,72,00,b2,00,00,00,00,00
00000000h: FF FE 57 00 69 00 6E 00 64 00 6F 00 77 00 73 00 ; ÿþW.i.n.d.o.w.s.
00000010h: 20 00 52 00 65 00 67 00 69 00 73 00 74 00 72 00 ; .R.e.g.i.s.t.r.
00000020h: 79 00 20 00 45 00 64 00 69 00 74 00 6F 00 72 00 ; y. .E.d.i.t.o.r.
00000030h: 20 00 56 00 65 00 72 00 73 00 69 00 6F 00 6E 00 ; .V.e.r.s.i.o.n.
00000040h: 20 00 35 00 2E 00 30 00 30 00 0D 00 0A 00 0D 00 ; .5...0.0.......
00000050h: 0A 00 5B 00 48 00 4B 00 45 00 59 00 5F 00 43 00 ; ..[.H.K.E.Y._.C.
00000060h: 55 00 52 00 52 00 45 00 4E 00 54 00 5F 00 55 00 ; U.R.R.E.N.T._.U.
00000070h: 53 00 45 00 52 00 5C 00 52 00 65 00 67 00 46 00 ; S.E.R.\.R.e.g.F.
00000080h: 6F 00 72 00 6D 00 61 00 74 00 5D 00 0D 00 0A 00 ; o.r.m.a.t.].....
00000090h: 22 00 54 00 77 00 6F 00 20 00 4E 00 6F 00 74 00 ; ".T.w.o. .N.o.t.
000000a0h: 20 00 45 00 71 00 75 00 61 00 6C 00 20 00 33 00 ; .E.q.u.a.l. .3.
000000b0h: 22 00 3D 00 22 00 32 00 20 00 60 22 20 00 33 00 ; ".=.".2. .`" .3.
000000c0h: 22 00 0D 00 0A 00 22 00 46 00 6F 00 72 00 6D 00 ; ".....".F.o.r.m.
000000d0h: 75 00 6C 00 61 00 73 00 22 00 3D 00 68 00 65 00 ; u.l.a.s.".=.h.e.
000000e0h: 78 00 28 00 37 00 29 00 3A 00 33 00 32 00 2C 00 ; x.(.7.).:.3.2.,.
000000f0h: 30 00 30 00 2C 00 32 00 30 00 2C 00 30 00 30 00 ; 0.0.,.2.0.,.0.0.
00000100h: 2C 00 62 00 35 00 2C 00 30 00 30 00 2C 00 37 00 ; ,.b.5.,.0.0.,.7.
00000110h: 33 00 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 ; 3.,.0.0.,.2.0.,.
00000120h: 30 00 30 00 2C 00 64 00 37 00 2C 00 30 00 30 00 ; 0.0.,.d.7.,.0.0.
00000130h: 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 33 00 ; ,.2.0.,.0.0.,.3.
00000140h: 33 00 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 ; 3.,.0.0.,.2.0.,.
00000150h: 30 00 30 00 2C 00 33 00 64 00 2C 00 30 00 30 00 ; 0.0.,.3.d.,.0.0.
00000160h: 2C 00 5C 00 0D 00 0A 00 20 00 20 00 32 00 30 00 ; ,.\..... . .2.0.
00000170h: 2C 00 30 00 30 00 2C 00 33 00 36 00 2C 00 30 00 ; ,.0.0.,.3.6.,.0.
00000180h: 30 00 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 ; 0.,.2.0.,.0.0.,.
00000190h: 62 00 35 00 2C 00 30 00 30 00 2C 00 37 00 33 00 ; b.5.,.0.0.,.7.3.
000001a0h: 2C 00 30 00 30 00 2C 00 30 00 30 00 2C 00 30 00 ; ,.0.0.,.0.0.,.0.
000001b0h: 30 00 2C 00 34 00 31 00 2C 00 30 00 30 00 2C 00 ; 0.,.4.1.,.0.0.,.
000001c0h: 32 00 30 00 2C 00 30 00 30 00 2C 00 33 00 64 00 ; 2.0.,.0.0.,.3.d.
000001d0h: 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 30 00 ; ,.0.0.,.2.0.,.0.
000001e0h: 30 00 2C 00 63 00 30 00 2C 00 30 00 33 00 2C 00 ; 0.,.c.0.,.0.3.,.
000001f0h: 32 00 30 00 2C 00 30 00 30 00 2C 00 64 00 37 00 ; 2.0.,.0.0.,.d.7.
00000200h: 2C 00 5C 00 0D 00 0A 00 20 00 20 00 30 00 30 00 ; ,.\..... . .0.0.
00000210h: 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 37 00 ; ,.2.0.,.0.0.,.7.
00000220h: 32 00 2C 00 30 00 30 00 2C 00 62 00 32 00 2C 00 ; 2.,.0.0.,.b.2.,.
00000230h: 30 00 30 00 2C 00 30 00 30 00 2C 00 30 00 30 00 ; 0.0.,.0.0.,.0.0.
00000240h: 2C 00 30 00 30 00 2C 00 30 00 30 00 0D 00 0A 00 ; ,.0.0.,.0.0.....
00000250h: 0D 00 0A 00 ; ....
在Windows-1252字符集下,显示的前两个字节为ÿþ
,它们是UTF-16 LE BOM的两个字节,在文本编辑模式下无法显示。
但是,通过在导出对话框中点击“文件类型”下拉列表并选择Win9x/NT4注册表文件,以REGEDIT4格式导出键HKCU\RegFormat
会生成一个仅包含180字节内容的ANSI(更精确地说是Windows-1252编码)文本文件:
REGEDIT4
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"="2 ? 3"
"Formulas"=hex(7):32,20,b5,73,20,d7,20,33,20,3d,20,36,20,b5,73,00,41,20,3d,20,\
c0,20,d7,20,72,b2,00,00
00000000h: 52 45 47 45 44 49 54 34 0D 0A 0D 0A 5B 48 4B 45 ; REGEDIT4....[HKE
00000010h: 59 5F 43 55 52 52 45 4E 54 5F 55 53 45 52 5C 52 ; Y_CURRENT_USER\R
00000020h: 65 67 46 6F 72 6D 61 74 5D 0D 0A 22 54 77 6F 20 ; egFormat].."Two
00000030h: 4E 6F 74 20 45 71 75 61 6C 20 33 22 3D 22 32 20 ; Not Equal 3"="2
00000040h: 3F 20 33 22 0D 0A 22 46 6F 72 6D 75 6C 61 73 22 ; ? 3".."Formulas"
00000050h: 3D 68 65 78 28 37 29 3A 33 32 2C 32 30 2C 62 35 ; =hex(7):32,20,b5
00000060h: 2C 37 33 2C 32 30 2C 64 37 2C 32 30 2C 33 33 2C ; ,73,20,d7,20,33,
00000070h: 32 30 2C 33 64 2C 32 30 2C 33 36 2C 32 30 2C 62 ; 20,3d,20,36,20,b
00000080h: 35 2C 37 33 2C 30 30 2C 34 31 2C 32 30 2C 33 64 ; 5,73,00,41,20,3d
00000090h: 2C 32 30 2C 5C 0D 0A 20 20 63 30 2C 32 30 2C 64 ; ,20,\.. c0,20,d
000000a0h: 37 2C 32 30 2C 37 32 2C 62 32 2C 30 30 2C 30 30 ; 7,20,72,b2,00,00
000000b0h: 0D 0A 0D 0A ; ....
有哪些区别?
REGEDIT 首先将类型为 REG_SZ 的字符串从 Unicode 转换为代码页 Windows-1252,然后导出数据。结果是在类型为 REG_SZ
的字符串中使用字符 ?
替代了 Unicode 值为 U+2260 的 不等于符号,因为该字符在代码页 Windows-1252 中不可用。
多行字符串只有十六进制值的一半(每个字符仅为 1 个字节,而不是每个字符为 2 个字节)。
小 PI,Unicode 值为 U+03C0,以值 C0(仅低位字节)存储,因此现在是字符 À
,因为该字符在代码页 Windows-1252 中的代码值为 0xC0。
以格式 Windows Registry Editor Version 5.00 从文件导入数据会导致在 Windows 注册表中获得与之前相同的数据。
但是,从格式为REGEDIT4的文件中导入数据的结果如下:
名称为Two Not Equal 3
的REG_SZ
类型字符串,其ANSI字符串值为:
2 ? 3
名称为Formulas
的REG_MULTI_SZ
类型多行字符串,其Unicode字符串值为:
2 µs × 3 = 6 µs
A = À × r²
字符µ
、×
和²
的代码值<255(十进制),因此也可以正确存储在格式为REGEDIT4的注册表文件中。但是,≠
和π
无法在格式4中正确编码。
格式为Windows Registry Editor Version 5.00的注册表文件本身不必是Unicode编码的文本文件。也可以使用Windows-1252编码的注册表文件来存储内容:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"=hex(1):32,00,60,22,33,00
"Formulas"=hex(7):32,00,20,00,b5,00,73,00,20,00,d7,00,20,00,33,00,20,00,3d,00,\
20,00,36,00,20,00,b5,00,73,00,00,00,41,00,20,00,3d,00,20,00,c0,03,20,00,d7,\
00,20,00,72,00,b2,00,00,00,00,00
在十六进制查看器/编辑器中显示为:
00000000h: 57 69 6E 64 6F 77 73 20 52 65 67 69 73 74 72 79 ; Windows Registry
00000010h: 20 45 64 69 74 6F 72 20 56 65 72 73 69 6F 6E 20 ; Editor Version
00000020h: 35 2E 30 30 0D 0A 0D 0A 5B 48 4B 45 59 5F 43 55 ; 5.00....[HKEY_CU
00000030h: 52 52 45 4E 54 5F 55 53 45 52 5C 52 65 67 46 6F ; RRENT_USER\RegFo
00000040h: 72 6D 61 74 5D 0D 0A 22 54 77 6F 20 4E 6F 74 20 ; rmat].."Two Not
00000050h: 45 71 75 61 6C 20 33 22 3D 68 65 78 28 31 29 3A ; Equal 3"=hex(1):
00000060h: 33 32 2C 30 30 2C 36 30 2C 32 32 2C 33 33 2C 30 ; 32,00,60,22,33,0
00000070h: 30 0D 0A 22 46 6F 72 6D 75 6C 61 73 22 3D 68 65 ; 0.."Formulas"=he
00000080h: 78 28 37 29 3A 33 32 2C 30 30 2C 32 30 2C 30 30 ; x(7):32,00,20,00
00000090h: 2C 62 35 2C 30 30 2C 37 33 2C 30 30 2C 32 30 2C ; ,b5,00,73,00,20,
000000a0h: 30 30 2C 64 37 2C 30 30 2C 32 30 2C 30 30 2C 33 ; 00,d7,00,20,00,3
000000b0h: 33 2C 30 30 2C 32 30 2C 30 30 2C 33 64 2C 30 30 ; 3,00,20,00,3d,00
000000c0h: 2C 5C 0D 0A 20 20 32 30 2C 30 30 2C 33 36 2C 30 ; ,\.. 20,00,36,0
000000d0h: 30 2C 32 30 2C 30 30 2C 62 35 2C 30 30 2C 37 33 ; 0,20,00,b5,00,73
000000e0h: 2C 30 30 2C 30 30 2C 30 30 2C 34 31 2C 30 30 2C ; ,00,00,00,41,00,
000000f0h: 32 30 2C 30 30 2C 33 64 2C 30 30 2C 32 30 2C 30 ; 20,00,3d,00,20,0
00000100h: 30 2C 63 30 2C 30 33 2C 32 30 2C 30 30 2C 64 37 ; 0,c0,03,20,00,d7
00000110h: 2C 5C 0D 0A 20 20 30 30 2C 32 30 2C 30 30 2C 37 ; ,\.. 00,20,00,7
00000120h: 32 2C 30 30 2C 62 32 2C 30 30 2C 30 30 2C 30 30 ; 2,00,b2,00,00,00
00000130h: 2C 30 30 2C 30 30 0D 0A 0D 0A ; ,00,00....
导入此注册表文件将在Windows注册表中生成Unicode字符串:
2 ≠ 3
2 µs × 3 = 6 µs
A = À × r²
使用二进制表示法hex(1)
来表示REG_SZ
类型的值并不标准。此示例是我手动创建的,以证明可以在非Unicode编码的注册表文件中导入REG_SZ
类型的Unicode字符串,这样更容易从批处理文件中生成。
但是,如果键或值的名称本身包含一个代码值大于U+00FF的Unicode字符,则确实需要使用注册表文件格式Windows Registry Editor Version 5.00,并且注册表文件也要使用16位Unicode转换格式和小端格式进行编码。
请参见函数SHRegWriteUSValue,了解hex(?) ... REG_?注册表类型表。
顺便说一下:我曾经编写过UltraEdit脚本GetStringFromRegHex.js,用于获取在文本编辑器UltraEdit中打开的注册表文件中选择的类型为hex(2)
... REG_EXPAND_SZ
和hex(7)
... REG_MULTI_SZ
的十六进制值,因为这些十六进制值对于人类来说真的很难“作为文本”阅读。%SystemRoot%\System32\regedit.exe /a /e "%USERPROFILE%\Desktop\EntireWindowsRegistry.reg"
将整个Windows注册表导出到Windows桌面,使用注册表文件格式4的ANSI编码。
不带选项/a
的相同命令行会导出整个Windows注册表,使用注册表文件格式5的Unicode编码。