哪个注册表编辑器版本在编辑Windows注册表时启动注册文件(如果需要的话)?

时间:2016-04-22 05:34:26

标签: windows batch-file windows-7 registry

根据Microsoft knowledge base article 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 个答案:

答案 0 :(得分:3)

主要使用两个标准应用程序来处理批处理文件中的Windows注册表:

  • REG.EXE
  • REGEDIT.EXE

在Windows x64上,它们都以32位和64位应用程序的形式存在,32位版本访问注册表,如32位应用程序,这意味着registry redirector处于活动状态,64位应用程序的注册表项是对于32位 REG REGEDIT 不可见。

通常最好使用 REG 而不是 REGEDIT 来获取(读访问权限)或设置(写访问权限)批处理文件中的几个键或值。

REGEDIT 的使用始终需要管理员权限,因为Windows Vista甚至只用于将密钥导出到注册表文件(读访问权限)或从注册表文件(写访问权限)导入数据< strong> HKEY_CURRENT_USER (简称:HKCU)。

使用 REG 许多操作,例如 QUERY (读访问权限)或 ADD (写访问权限)到HKCU不需要管理员特权。当然,对 HKEY_LOCAL_MACHINE (简称:HKLM)的写访问权限需要管理员权限以及其他不常用的操作。在命令提示符窗口reg /?中运行会显示可用的操作。在控制台窗口中执行的reg query /?reg add /?显示了在Windows注册表中获取(查询)或设置(添加)数据的语法和选项。

如果文件的第一行包含

,则仅在导入时将* .reg文件解释为具有有效注册表数据的文件
  • REGEDIT4
  • Windows注册表编辑器版本5.00

这不是注册表编辑器或Windows版本的版本。它是文件本身中注册表数据格式的版本信息。所以它是一个注册表文件格式版本。注册表文件的第一行必须具有这两个字符串中的一个。

尝试导入没有此标题行的* .reg文件会导致错误。

Windows 2000(还有 regedt32.exe )和更高版本的Windows支持两种格式版本4和5的注册表文件。

Windows 95,98,Millennium和NT4仅支持格式为4的注册表文件。

因此,现在(2016年)主要依赖于用于注册表文件的数据格式。

主要区别在于支持的encoding文字数据。

REGEDIT4 格式的注册表文件只能使用code page中为Windows region settings定义的Windows-1252文本文件,其中Unicode用于非Unicode感知应用程序{{3}对于北美和西欧国家。因此, REGEDIT4 格式的注册表文件不能包含代码值大于255(十进制,0xFF十六进制)的Unicode个字符。

格式 Windows注册表编辑器版本5.00 的注册表文件支持根据UTF-16标准编码的每个字符超过1个字节的文本。因此, Windows注册表编辑器版本5.00 格式的* .reg文件由 REGEDIT 创建为Little Endian Byte Order Mark编码的文本文件ASCII (FF FE)。

因此,如果要导入/导出的数据是二进制文件或仅使用code page 437个字符(代码值&lt;十进制128)的文本,因为99.99%的注册表数据都是,则使用哪种文件格式无关紧要。

对于非ASCII字符,了解Windows命令解释程序使用哪个代码页非常重要,因为这通常是OEM代码页,如code page 850(美国,加拿大)或Registry Value Types(西欧) )与GUI代码页Windows-1252不同。在命令提示符窗口chcpmode con中运行,通过Windows命令解释程序输出当前计算机上用于控制台的默认代码页。

如果确实需要支持Unicode字符串,则必须使用格式 Windows注册表编辑器版本5.00

让我们看一个假设的Unicode示例:

在密钥HKCU\RegFormat下的Windows注册表中,定义了两个Unicode字符串:

  • 类型为REG_SZ的字符串,名称为Two Not Equal 3,带有Unicode字符串值:

    2 ≠ 3

  • 类型为REG_MULTI_SZ的多行字符串,其名称为Formulas,具有Unicode字符串值:

    2 µs × 3 = 6 µs
    A = π × r²

有关注册表值类型的详细信息,请参阅Microsoft文章Distributing Registry ChangesData Types in the Registrynot equal sign

以格式 Windows注册表编辑器版本5.00 格式导出密钥HKCU\RegFormat,因为Windows 2000会生成带有596字节内容的UTF-16 LE编码文本文件:

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显示的前2个字节为ÿþ是UTF-16 LE BOM的两个字节,文本编辑器在文本编辑模式下不会显示这两个字节。

但是,通过单击导出对话框中的文件类型下拉列表并选择 Win9x / NT4注册表文件<,以 REGEDIT4 格式导出密钥HKCU\RegFormat / strong>产生ANSI(更精确:Windows-1252)编码的文本文件,内容只有180个字节:

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,然后导出数据。结果是字符?而不是small PI,其中Unicode值为U + 2260,类型为REG_SZ的字符串,因为此字符在代码页Windows-1252中不可用。

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

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

  4. Windows注册表编辑器5.00版格式从文件导入数据导致在Windows注册表中获取与以前相同的数据。

    但是以 REGEDIT4 格式从文件导入数据会导致:

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

      2 ? 3

    • 类型为REG_MULTI_SZ的多行字符串,其名称为Formulas,具有Unicode字符串值:

      2 µs × 3 = 6 µs
      A = À × r²

    字符µ×以及²的代码值< 255(十进制),因此也可以正确存储在格式 REGEDIT4 的注册表文件中。但π无法以格式4进行正确编码。

    格式为 Windows注册表编辑器版本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注册表编辑器版本5.00 注册表文件也使用16位Unicode转换格式进行Unicode编码,并使用little-endian格式。

    请参阅功能GetStringFromRegHex.js了解十六进制)... REG _ 注册表类型表。

    顺便说一下:我写了一次UltraEdit脚本{{3}}来获取类型为hex(2)的十六进制值... REG_EXPAND_SZhex(7) ... {{1在文本编辑器UltraEdit中打开的注册表文件中选择显示为文本,因为十六进制值非常难以读作文本&#34;为了人类。

    命令行

    REG_MULTI_SZ

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

    没有选项%SystemRoot%\System32\regedit.exe /a /e "%USERPROFILE%\Desktop\EntireWindowsRegistry.reg" 的同一命令行导致使用注册表文件格式5以Unicode格式导出整个Windows注册表。