在编辑Windows注册表时,应该使用哪个版本的注册表编辑器来启动reg文件(如果需要的话)?

5
根据Microsoft知识库文章310516, 在Windows注册表中编辑.reg文件应该使用以下之一开头:
  • Windows Registry Editor Version 5.00
    适用于Windows 2000、Windows XP和Windows Server 2003
    或者
  • REGEDIT4
    适用于Windows 95、Windows 98和Windows NT 4.0。
当在Windows 7上时,是使用 Windows Registry Editor Version 5.00 还是需要声明版本6呢?
在运行.bat文件时是否需要这样做?
要查看当前版本,请在“帮助”菜单中的“注册表编辑器”中单击“关于注册表编辑器”菜单项。
1个回答

5

在批处理文件中,主要有两个标准应用程序用于处理Windows注册表:

  • reg.exe
  • regedit.exe
在Windows x64上,两者都存在32位和64位应用程序,其中32位版本像32位应用程序一样访问注册表,这意味着注册表重定向器处于活动状态,并且64位应用程序的注册表键对于32位REGREGEDIT不可见。
通常最好使用REG而不是REGEDIT来批处理获取(读取访问)或设置(写入访问)少量键或值。
自Windows Vista以来,即使仅用于将密钥导出到注册表文件(读取访问)或从注册表文件导入数据(写入访问)到HKEY_CURRENT_USER(简称:HKCU),使用REGEDIT始终需要管理员特权。
通过使用REG,许多操作(如查询(读取访问)或添加(写入访问)到HKCU)不需要管理员权限。当然,对HKEY_LOCAL_MACHINE(简称:HKLM)的写访问需要管理员权限,以及其他不常用的操作。在命令提示符窗口中运行reg /?将显示可用操作。在控制台窗口中执行reg query /?reg add /?将显示语法和选项,以获取(查询)或设置(添加)Windows注册表中的数据。
仅在导入时解释*.reg文件为具有有效注册表数据的文件,如果文件的第一行包含以下内容:
  • REGEDIT4
  • Windows Registry Editor Version 5.00
这不是注册表编辑器或Windows版本的版本。它是文件本身中注册表数据格式的版本信息。因此,它是一个注册表文件格式版本。注册表文件的第一行必须有这两个字符串之一。 尝试导入没有此标题行的*.reg文件会导致错误。

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字符(代码值<小于128),则使用哪种文件格式都无所谓,因为这占所有注册表数据的99.99%。

对于非ASCII字符,了解Windows命令解释器使用的代码页非常重要,因为通常它是OEM代码页,如代码页437(美国,加拿大)或代码页850(西欧),与GUI代码页Windows-1252不同。在命令提示窗口中运行chcpmode 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 TypesDistributing Registry ChangesData 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                                     ; ....

有哪些区别?

  1. REGEDIT 首先将类型为 REG_SZ 的字符串从 Unicode 转换为代码页 Windows-1252,然后导出数据。结果是在类型为 REG_SZ 的字符串中使用字符 ? 替代了 Unicode 值为 U+2260 的 不等于符号,因为该字符在代码页 Windows-1252 中不可用。

  2. 多行字符串只有十六进制值的一半(每个字符仅为 1 个字节,而不是每个字符为 2 个字节)。

  3. 小 PI,Unicode 值为 U+03C0,以值 C0(仅低位字节)存储,因此现在是字符 À,因为该字符在代码页 Windows-1252 中的代码值为 0xC0。

以格式 Windows Registry Editor Version 5.00 从文件导入数据会导致在 Windows 注册表中获得与之前相同的数据。

但是,从格式为REGEDIT4的文件中导入数据的结果如下:

  • 名称为Two Not Equal 3REG_SZ类型字符串,其ANSI字符串值为:

    2 ? 3

  • 名称为FormulasREG_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_SZhex(7) ... REG_MULTI_SZ的十六进制值,因为这些十六进制值对于人类来说真的很难“作为文本”阅读。
命令行
%SystemRoot%\System32\regedit.exe /a /e "%USERPROFILE%\Desktop\EntireWindowsRegistry.reg"

将整个Windows注册表导出到Windows桌面,使用注册表文件格式4的ANSI编码。

不带选项/a的相同命令行会导出整个Windows注册表,使用注册表文件格式5的Unicode编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接