注册表命令的冷知识

目录

导入:

导出:

启动:

REM reg /?

  * 以下数据在 Win10 测得:

【注册表键值长度上限表】

REG ADD /?

REG QUERY /?

REG EXPORT /?

REG FLAGS /?

【标志】

【注册表虚拟化范围】


导入:

    Regedit /S filename

    /S         隐藏导入的确认信息。


导出:

    Regedit [/L:sytem] [/R:user] /E pathname [regpath]

    /L:        sytem, 指定 system.dat 文件的存放位置。
    /R:        user, 指定 user.dat 文件的存放位置。
    /E:        导出所有子项和值。filename 指定导出注册表文件的路径名。导出项长度不受限制。覆盖旧文件。
    /A:        导出部分子项和值。只在属于 ANSI 模式的那部分,跳过任何 unicode 键/值。
    regpath    指定导出注册表文件的开始子键(缺省为全部子键)。

    如果是通过从软盘(WinPE)启动并进入 DOS,那么就必须使用 /L 和 /R 参数来指定 system.dat 和 user.dat 文件的具体路径,
    否则注册表编辑器将无法找到它们。

    Regedit [/L:sytem] [/R:user] /C filename

    /C filename 指定形成注册表数据库的路径名。即压缩 [文件名] (Windows 98)。

启动:

    Regedit /M
    /M         打开注册表编辑器的多个副本。

:: ---------------------------------------------------------------------------------------------------------------------

REM https://ss64.com/nt/reg.html
REM https://learn.microsoft.com/zh-cn/windows/win32/sysinfo/registry-element-size-limits#注册表元素大小限制
REM https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/reg-add
REM https://learn.microsoft.com/zh-cn/windows/win32/sysinfo/registry-virtualization#reg flags
REM "\G 小盘\程序库\Shell\Windows\批处理 实用语法\REG\注册表五键九值.reg"

REM reg /?

REG Operation [Parameter List]

  Operation  [ QUERY   | ADD    | DELETE  | COPY    |
               SAVE    | LOAD   | UNLOAD  | RESTORE |
               COMPARE | EXPORT | IMPORT  | FLAGS ]

返回代码: (除了 REG COMPARE)

  0 - 成功
  1 - 失败

要得到有关某个操作的帮助,请键入:

  REG Operation /?

例如:
  REG QUERY /?        -- 输出 TABLE 格式数据, 不输出像 *.reg 样式的数据。
  REG ADD /?        -- [ROOTKEY\SUBKEY] or "value"="data"; 子项长度 $1。
  REG DELETE /?        -- [ROOTKEY\SUBKEY] or "value"="data";
  REG COPY /?        -- [ROOTKEY\SUBKEY] or +/s 包含各层子项
  REG SAVE /?        -- *.hiv; 不导出主项名,只导出项之下的数值和子项。
  REG RESTORE /?    -- *.hiv; 导入主项的位置必须存在,导入主项长度 $2。导入内容包括子项时,子项长度 $1。
  REG LOAD /?        -- *.hiv; 加载项的位置空则创建,加载内容包括子项时,子项长度 $1。LOAD/UNLOAD 的根项必须是 HKLM 或 HKU。
  REG UNLOAD /?        -- [ROOTKEY\SUBKEY] 卸载项的位置必须存在。项和子项长度 $1
  REG COMPARE /?    -- [ROOTKEY\SUBKEY] or "value"="data"
  REG EXPORT /?        -- *.reg 包含各层子项。导出主项长度超过 $3 个字符时,会被截断。子项长度超过 $3 个字符时,导出过程中断,只导出此子项之前的项。
  REG IMPORT /?        -- *.reg 包含各层子项。导入叶子项长度 $2。
  REG FLAGS /?        -- [ROOTKEY\SUBKEY] 设置注册表项的虚拟化,如将项 HKEY_LOCAL_MACHINE\Software\xxx 重定向到 HKEY_USERS\_Classes\VirtualStore\Machine\xxx,以便获取访问权限。

  * 以下数据在 Win10 测得:


  $0: [根项\中间项\叶子项] 
      [主项] 为传入参数 KeyName
      [主项\中间项\...]
      [主项\中间项\...\叶子项]
  $1: 
      注册表根项下子项深度最多 32 层。超出层数时无法查看,但可以导出。
      每个子项名称最长 254(命令行),256(手动) 个字符。
      每个数值名称最长              259(手动) 个字符。
      每个数值数据最长              30000(手动) 个字符,类型为 REG_SZ 时。  
      详见:【注册表键值长度上限表】
  $2: 叶子项名称最长为命令行最大行长度 8192 - [叶子项前后字符长度和]。简称为: 最长<8192(命令行)
  $3: 240(命令行);?(手动)
  $3: ?(命令行);30000(手动)
  $4: 变量引用时无限制,字面字符串引用时最长<8192(命令行);无限多页(内存范围内),每页64KB(手动)

:: ---------------------------------------------------------------------------------------------------------------------

【注册表键值长度上限表】

当主项为以下情况时:

注册表键值长度上限表
命令行       最长项名(254)   最长项名(手动256)   最长值名(259)   最长值数据(REG_SZ,3w)   最长值数据(REG_BINARY 无限多页,每页64KB)
reg query        OK              NO                  OK              OK                      OK
reg add          OK              NO                  OK              NO                      NO
reg copy         OK              NO                  OK              OK                      OK
reg export       OK              NO                  NO              OK                      OK
regedit /e       OK              OK                  OK              OK                      OK


 

:查询结果长度
    查询项长度:    
    查询值长度:    
    查询数据长度:    

:创建长度
    创建项长度:    
    创建值长度:    
    创建数据长度:    REG_SZ:$3,  REG_BINARY:$4, 

:复制长度
    复制项长度:    
    复制值长度:    
    复制数据长度:    

:还原长度
    还原主项长度:    $2
    还原子项长度:    $1
    还原值长度:    
    还原数据长度:    

:加载长度
    加载主项长度:    
    加载子项长度:    $1
    加载值长度:    
    加载数据长度:    

:卸载长度
    卸载主项长度:    $1
    卸载子项长度:    $1
    卸载值长度:    
    卸载数据长度:    

:导入长度
    导入叶子项长度:    $2
    导入值长度:    
    导入数据长度:    

:导出长度
    导出子项长度:    $3
    导出值长度:    
    导出数据长度:    

:: ---------------------------------------------------------------------------------------------------------------------

REG ADD /?

REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f]
        [/reg:32 | /reg:64]

  KeyName  [\\Machine\]FullKey
           Machine  远程机器名 - 忽略默认到当前机器。远程机器上
                    只有 HKLM 和 HKU 可用。
           FullKey  ROOTKEY\SubKey
           ROOTKEY  [ HKLM | HKCU | HKCR | HKU | HKCC ]
           SubKey   所选 ROOTKEY 下注册表项的完整名称。

  /v       所选项之下要添加的值名称。

  /ve      为注册表项添加空白值名称(默认)。

  /t       RegKey 数据类型
           [ REG_SZ    | REG_MULTI_SZ | REG_EXPAND_SZ |
             REG_DWORD | REG_QWORD    | REG_BINARY    | REG_NONE ]
           如果忽略,则采用 REG_SZ。

  /s       指定一个在 REG_MULTI_SZ 数据字符串中用作分隔符的字符
           如果忽略,则将 "\0" 用作分隔符。

  /d       要分配给添加的注册表 ValueName 的数据。

  /f       不用提示就强行覆盖现有注册表项。

 /reg:32  指定应该使用 32 位注册表视图访问的注册表项。

 /reg:64  指定应该使用 64 位注册表视图访问的注册表项。

例如:

  REG ADD \\ABC\HKLM\Software\MyCo
    添加远程机器 ABC 上的一个注册表项 HKLM\Software\MyCo

  REG ADD HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead
    添加一个值(名称: Data,类型: REG_BINARY,数据: fe340ead)

  REG ADD HKLM\Software\MyCo /v MRU /t REG_MULTI_SZ /d fax\0mail
    添加一个值(名称: MRU,类型: REG_MULTI_SZ,数据: fax\0mail\0\0)

  REG ADD HKLM\Software\MyCo /v Path /t REG_EXPAND_SZ /d ^%systemroot^%
    添加一个值(名称: Path,类型: REG_EXPAND_SZ,数据: %systemroot%)
    注意: 在扩充字符串中使用插入符号 ( ^ )

:: ---------------------------------------------------------------------------------------------------------------------

REG QUERY /?

REG QUERY KeyName [/v [ValueName] | /ve] [/s]
          [/f Data [/k] [/d] [/c] [/e]] [/t Type] [/z] [/se Separator]
          [/reg:32 | /reg:64]

  KeyName  [\\Machine\]FullKey
           Machine - 远程机器名称,省略当前机器的默认值。在远程机器上
                     只有 HKLM 和 HKU 可用。
           FullKey - 以 ROOTKEY\SubKey 名称形式
                ROOTKEY - [ HKLM | HKCU | HKCR | HKU | HKCC ]
                SubKey  - 在选择的 ROOTKEY 下的注册表项的全名

  /v       具体的注册表项值的查询。
           如果省略,会查询该项的所有值。
           指定只在值名称中搜索。
           可多次使用通配符 * 。

           /v 与 /f 开关必须存在一个。
           注意:
              /k /d     是 /f 的次级开关。             表示“或”关系 /k∪ /d,     单独一个 /f = /f /d /k, 所以一般省略掉。
           /v /k        二者同时存在(没有 /s 或 /d), 表示互斥关系 /k∩  /v = ф   空集,将无法查找到任何结果。
           /v /k /d     三者同时存在(没有 /s),       表示“或”关系      /v∪ /d,忽略无效的 /k 开关,合并所有找到结果。 
           /v /k    /s  三者同时存在(没有       /d), 表示“且”关系 /k∩ {/v /s}, 即查找某名称为XX的子项中的某名称为YY的值。
           /v /k /d /s  四者同时存在,                 表示“或”关系(/k∩ {/v /s})∪ (/v∪ /d),合并以上两者找到的结果。

  /ve      查询默认值或空值名称(默认)。

  /s       循环查询所有子项和值(如 dir /s)。

  /se      为 REG_MULTI_SZ 在数据字符串中指定分隔符(长度只为 1 个字符)。
           默认分隔符为 "\0"。

  /f       指定搜索的数据或模式。
           如果字符串包含空格,请使用双引号。默认为 "*"。

  /k       指定只在子项名称中搜索。
           /k 与 /d 同时出现表示“或”关系,即并集 /k∪ /d。

  /d       指定只在数据中搜索。
           /k 与 /d 同时出现表示“或”关系

  /c       指定搜索时区分大小写。
           默认搜索为不区分大小写。

  /e       指定只返回完全匹配。
           默认是返回所有匹配。

  /t       指定注册表值数据类型。
           有效的类型是:
             REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ,
             REG_DWORD, REG_QWORD, REG_BINARY, REG_NONE
           默认为所有类型。

  /z       详细: 显示值名称类型的数字等值。

 /reg:32  指定应该使用 32 位注册表视图访问的注册表项。

 /reg:64  指定应该使用 64 位注册表视图访问的注册表项。

示例:

  REG QUERY HKLM\Software\Microsoft\ResKit /v Version
    显示注册表值 Version 的值

  REG QUERY \\ABC\HKLM\Software\Microsoft\ResKit\Nt\Setup /s
    显示远程机器 ABC 上的、在注册表项设置下的所有子项和值

  REG QUERY HKLM\Software\Microsoft\ResKit\Nt\Setup /se #
    用 "#" 作为分隔符,显示类型为 REG_MULTI_SZ 的所有值名称的所有
    子项和值。

  REG QUERY HKLM /f SYSTEM /t REG_SZ /c /e
    以区分大小写的形式显示项、值和数据和数据类型 REG_SZ
    的、在 HKLM 更目录下的、"SYSTEM" 出现的精确次数

  REG QUERY HKCU /f 0F /d /t REG_BINARY
    显示在 HKCU 根目录下、数据类型为 REG_BINARY 的数据的项、值和
    数据的 "0F" 出现的次数。

  REG QUERY HKLM\SOFTWARE /ve
    显示在 HKLM\SOFTWARE 下的项、值和数据(默认)

:: ---------------------------------------------------------------------------------------------------------------------

REG EXPORT /?

REG EXPORT KeyName FileName [/y] [/reg:32 | /reg:64]

  Keyname    ROOTKEY[\SubKey] (只是本地机器)。
    ROOTKEY  [ HKLM | HKCU | HKCR | HKU | HKCC ]
    SubKey   所选 ROOTKEY 下的注册表项的全名。

  FileName   要导出的磁盘文件名。

  /y       不用提示就强行覆盖现有文件。

 /reg:32  指定应该使用 32 位注册表视图访问的注册表项。

 /reg:64  指定应该使用 64 位注册表视图访问的注册表项。

例如:

  REG EXPORT HKLM\Software\MyCo\MyApp AppBkUp.reg
    将注册表项 MyApp 的所有子项和值导出到文件 AppBkUp.reg


  将注册表项 MyApp 的值和子项名称导出到文件 AppBkUp.reg,不导出子项的内容。

REG COPY HKLM\Software\MyCo\MyApp HKCU\Software\MyCo\MyApp
  REG EXPORT HKCU\Software\MyCo\MyApp AppBkUp_unicode.reg
  type AppBkUp_unicode.reg > AppBkUp_ansi.reg
  for /f "skip=2 delims=" %%s in ('findstr .* "AppBkUp_ansi.reg"') do (
    setlocal DisableDelayedExpansion
        set "str=%%s"
        setlocal EnableDelayedExpansion
            set "str=!str:HKCU\Software\MyCo\MyApp=HKLM\Software\MyCo\MyApp!"
            (echo.!str!)>>AppBkUp.reg
        endlocal
    endlocal
  )
  REG DELETE HKCU\Software\MyCo\MyApp
  DEL /F /Q AppBkUp_unicode.reg AppBkUp_ansi.reg

:: ---------------------------------------------------------------------------------------------------------------------

REG FLAGS /?

REG FLAGS KeyName [QUERY |
                   SET [DONT_VIRTUALIZE] [DONT_SILENT_FAIL] [RECURSE_FLAG]]
                  [/reg:32 | /reg:64]

  Keyname    "HKLM\Software"[\SubKey] (仅限本地计算机上的这些密钥)。
    SubKey   HKLM\Software 下注册表项的全名。
  DONT_VIRTUALIZE DONT_SILENT_FAIL RECURSE_FLAG
   与 SET 一起使用;将设置在命令行上指定的标志,同时将清除没有指定的标志。

 /reg:32  指定应该使用 32 位注册表视图访问的注册表项。

 /reg:64  指定应该使用 64 位注册表视图访问的注册表项。

示例:

  REG FLAGS HKLM\Software\MyCo\MyApp QUERY
    显示密钥 MyApp 的当前标志。

  REG FLAGS HKLM\Software\MyCo\MyApp SET DONT_VIRTUALIZE /s
    设置 MyApp 及其所有子密钥上的 DONT_VIRTUALIZE 标志
    (并清除 DONT_SILENT_FAIL 和 RECURSE_FLAG)

【标志】

REG_KEY_DONT_SILENT_FAIL
    此标志禁用开放注册表虚拟化。 如果设置了此标志,并且打开操作在启用了虚拟化的密钥上失败,则注册表不会尝试重新打开该密钥。 如果此标志明确,注册表会尝试使用 MAXIMUM_ALLOWED 访问而不是请求的访问权限重新打开密钥。

REG_KEY_DONT_VIRTUALIZE
    此标志禁用写入注册表虚拟化。 如果设置了此标志,并且由于调用方对父密钥没有足够的访问权限而创建键或设置值操作失败,则注册表将失败该操作。 如果此标志明确,注册表将尝试在虚拟存储中写入密钥或值。 调用方必须在父密钥上具有 KEY_READ。

REG_KEY_RECURSE_FLAG
    如果设置了此标志,则会从父键传播注册表虚拟化标志。 如果此标志明确,则不会传播注册表虚拟化标志。 更改此标志仅影响更改标志后创建的新后代键。 它不会为现有后代键设置或清除这些标志。

【注册表虚拟化范围】

1.仅为以下项启用注册表虚拟化:

* 32 位交互式进程。
* HKEY_LOCAL_MACHINE\Software 中的键。
* 管理员可以写入的密钥。 (如果管理员无法写入密钥,则应用程序在以前版本的 Windows 上也会失败,即使它是由管理员运行的。)

2.针对以下项禁用注册表虚拟化:

* 64 位进程。
* 非交互式进程,例如服务。
  请注意,使用注册表作为进程间通信 (IPC) 机制的服务 (或任何其他未启用虚拟化) ,如果密钥虚拟化,应用程序将无法正常工作。 
  例如,如果防病毒服务根据应用程序设置的值更新其签名文件,该服务将永远不会更新其签名文件,因为服务从全局存储读取,
  但应用程序写入虚拟存储。
* 模拟用户的进程。 如果进程在模拟用户时尝试操作,则不会虚拟化该操作。
* 驱动程序等内核模式进程。
* 在其清单中指定的 requestedExecutionLevel 的进程。
* HKEY_LOCAL_MACHINE\Software\Classes、 
  HKEY_LOCAL_MACHINE\Software\Microsoft\Windows 和 
  HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT 的键和子项

:: ---------------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(Windows,cmd,注册表,registry,reg.exe,regedit.exe,windows)