Board logo

标题: [原创] 【续】[一日一教学](30)操控注册表:reg [打印本页]

作者: Hello123World    时间: 2011-9-9 17:26     标题: 【续】[一日一教学](30)操控注册表:reg

本帖最后由 Hello123World 于 2012-4-13 17:57 编辑

【原】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-2576-1-1.html
【续】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-13798-1-1.html


帮助信息:
  1. REG Operation [Parameter List]
  2.   Operation  [ QUERY   | ADD    | DELETE  | COPY    |
  3.                SAVE    | LOAD   | UNLOAD  | RESTORE |
  4.                COMPARE | EXPORT | IMPORT  | FLAGS ]
  5. 返回代码: (除了 REG COMPARE)
  6.   0 - 成功
  7.   1 - 失败
  8. 要得到有关某个操作的帮助,请键入:
  9.   REG Operation /?
  10. 例如:
  11.   REG QUERY /?
  12.   REG ADD /?
  13.   REG DELETE /?
  14.   REG COPY /?
  15.   REG SAVE /?
  16.   REG RESTORE /?
  17.   REG LOAD /?
  18.   REG UNLOAD /?
  19.   REG COMPARE /?
  20.   REG EXPORT /?
  21.   REG IMPORT /?
  22.   REG FLAGS /?
复制代码
命令概括:
reg,全英文registry,意为:注册;这里可以引申为注册表。

reg命令下辖12个操作开关,每个操作开关又有众多的参数;

在批处理中最强大的命令无疑是for,但是最给力的绝对是reg(除了给力,我不知道该怎么形容了);

reg命令可直接操作注册表,注册表是windows的数据库,所以关键不是reg而是注册表!但reg既然可以操作注册表,那么即便关键不是reg,那也是reg。

注册表(Registry)是一个系统设置数据库,它存放了系统软件与硬件设置,同时网络运行设置也放在其中,可见其在系统启动、运行等方面的重要性。



为了直观的显示此命令究竟是怎么给力的,展示两个常用的功能。
1.增加系统启动项(一般是把文件拖到开始菜单——程序——启动,实现开机自启动;删除开机启动一般是在 msconfig /4 中设置)
  1. @echo off
  2. echo 修改系统启动项
  3. set /p girl=输入要添加的程序的名称:
  4. set /p boy=输入该程序的完全路径:
  5. reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v %girl% /d %boy% /f
复制代码
2.qq自启动。
  1. @echo off
  2. reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v qq /d "F:\腾讯软件\qq\qq.exe" /f
复制代码
将F:\腾讯软件\qq\qq.exe改成对应的完全路径即可。


参数详解:

展示完了,那就先从reg add说起。
reg add帮助:
  1. REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f]
  2.   KeyName  [\\Machine\]FullKey
  3.            Machine  远程机器名 - 忽略默认到当前机器。远程机器上
  4.                     只有 HKLM 和 HKU。
  5.            FullKey  ROOTKEY\SubKey
  6.            ROOTKEY  [ HKLM | HKCU | HKCR | HKU | HKCC ]
  7.            SubKey   所选 ROOTKEY 下注册表项的完整名。
  8.   /v       所选项之下要添加的值名。
  9.   /ve      为注册表项添加空白值名(默认)。
  10.   /t       RegKey 数据类型
  11.            [ REG_SZ    | REG_MULTI_SZ | REG_EXPAND_SZ |
  12.              REG_DWORD | REG_QWORD    | REG_BINARY    | REG_NONE ]
  13.            如果忽略,则采用 REG_SZ。
  14.   /s       指定一个在 REG_MULTI_SZ 数据字符串中用作分隔符的字符
  15.            如果忽略,则将 "\0" 用作分隔符。
  16.   /d       要分配给添加的注册表 ValueName 的数据。
  17.   /f       不用提示就强行覆盖现有注册表项。
  18. 例如:
  19.   REG ADD \\ABC\HKLM\Software\MyCo
  20.     添加远程机器 ABC 上的一个注册表项 HKLM\Software\MyCo
  21.   REG ADD HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead
  22.     添加一个值(名称: Data,类型: REG_BINARY,数据: fe340ead)
  23.   REG ADD HKLM\Software\MyCo /v MRU /t REG_MULTI_SZ /d fax\0mail
  24.     添加一个值(名称: MRU,类型: REG_MUTLI_SZ,数据: fax\0mail\0\0)
  25.   REG ADD HKLM\Software\MyCo /v Path /t REG_EXPAND_SZ /d ^%systemroot^%
  26.     添加一个值(名称: Path,类型: REG_EXPAND_SZ,数据: %systemroot%)
  27.     注意: 在扩充字符串中使用插入符号 ( ^ )
复制代码
REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f]

reg add 下辖6个参数。
add,全英文add,意为:添加。
keyname,全英文keyname,意为:键名。
/v,全英文value,意为:值;这里引申为值名。
/ve,全英文value empty。意为:空值;这里引申为值名。(感谢cb02356828 的单词提供!)
/t,全英文type,意为:类型;
/s,全英文separator,意为:分隔符;
/d,全英文data,意为:数据;这里为了以区分方式加强记忆,可以多记几个单词,date(日期),dota(魔兽争霸rpg)。
/f,全英文force,意为:强迫;这里引申为强制。

这里出现了很多的新名词,有必要讲解一下这些新名词的含义(括号中是实际称谓),键名(项),值名(键名),值(键值);
例如:
  1. reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v qq /d "F:\腾讯软件\qq\qq.exe" /f
复制代码
其中,
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run就是“项”;

qq就是“键名”;可以自己设置。

F:\腾讯软件\qq\qq.exe就是“键值”;这里是我电脑上qq.exe的完全路径,根据自己电脑本身的qq.exe路径填写。



运行这段代码后,每次计算机启动都会自动运行qq.exe,实现qq的自动登录;(qq本身是可以设置自动登录的,但不少无名气的小软件本身都不可以定义自启动,这时候添加自启动的reg add 代码就用的上了)

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



上面这段引用的意思就是,在“键值”有特殊符号时,需要用^加以转义,要添加键值“%systemroot%”,就必须写成“^%systemroot^%”。

再以一个例子说明:
  1. @echo off
  2. title 信长之野望12pk改变窗口模式工具 by helloworld
  3. set /p a=1.全屏2.窗口(输入1或者2):
  4. if %a%==1 reg add  "HKCU\Software\KOEI\Nobunaga12pk tc\Configs" /v FullScreen /t REG_DWORD /d 1 /f && echo 信长之野望12pk将会以全屏启动
  5. if %a%==2 reg add  "HKCU\Software\KOEI\Nobunaga12pk tc\Configs" /v FullScreen /t REG_DWORD /d 0 /f && echo 信长之野望12pk将会以窗口启动
  6. pause>nul
复制代码
语法:reg add 项 /v 键名 /t 键值类型 /d 键值 /f(强制执行)



结合前面的两个代码,其实不难看出,在reg add命令中,最常用的就是 /v /d /f 三个参数,/value后跟键名,/data后跟键值,/force 表示强制执行。

省略/t参数时,默认的键值类型为 REG_SZ



这里以reg add为基础,全面的解析reg命令:

注册表就是上面那么4个关键的东西:项、键名、键值类型、键值;4个以外,再无其它;

因此,reg命令操作对象也就不过这4个东西,不管是add也好、delete也好、query也好,统统都是如此。

“师傅领进门,修行在个人”,以下只给出每个子命令的大致用法(reg add中的参数在不少其它的reg子命令中可以通用),不再阐述每个具体参数的意义(括号中是中文翻译)。

REG QUERY /?  query(查询),用来查询具体的项、键名、键值。
例子:
  1. ::获取ie缓存文件夹位置
  2. set zcb=
  3. set hc=
  4. set weizhi=
  5. set "zcb=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
  6. for /f "tokens=1* delims=Z" %%i in ('reg query "%zcb%" /v cache') do set "weizhi=%%j"
  7. set "hc=%weizhi:~1%"
  8. for /f "tokens=* delims= " %%i in ("%hc%") do set "hc=%%i"
  9. echo ie缓存文件夹位置:%hc%
复制代码
ie缓存文件夹位置,在windowsxp和windows7中的位置是有差别的,但是在注册表中存储“ie缓存文件夹位置”的地址却是一样的,某种意义上来说,注册表可以解决批处理的兼容性,换句话说,
就是利用reg命令可以解决批处理兼容性的问题!


  REG ADD /?  add(添加),用来添加具体的项、键名、键值。


  REG DELETE /?   delete(删除),用来删除具体的项、键名、键值。


  REG COPY /?  copy(复制),用来复制具体的项、键名、键值到另一个具体的项、键名、键值。


  REG SAVE /?  save(保存),用来保存具体的项、键名、键值,到以hiv为扩展名的文件中。(可以想象,必有一个还原hiv文件的reg子命令)
例子:
  1. REG SAVE HKLM\Software\MyCo\MyApp c:\AppBkUp.hiv
  2. ::将配置单元 MyApp 保存到c盘中的文件 AppBkUp.hiv
复制代码
REG RESTORE /? restore(还原),覆盖方式还原以hiv为扩展名的文件,到具体的项、键名、键值中。(跟reg save相对应)

例子:
  1. REG SAVE HKLM\Software\MyCo\MyApp c:\AppBkUp.hiv
  2.   
复制代码
项一直紧跟在子命令后面,不管什么reg子命令。


REG LOAD /? load(加载),追加方式还原以hiv为扩展名的文件,到具体的项、键名、键值中。(跟reg save相对应)

例子:
  1. REG LOAD HKLM\TempHive TempHive.hiv
  2.   将文件 TempHive.hiv 加载到注册表项 HKLM\TempHive
复制代码
“restore等同于>,load等同于>>”——类似这样。

  REG UNLOAD /? unload(卸载),将加载子命令load的操作删除。
例子:
  1. REG UNLOAD HKLM\TempHive
  2.   卸载 HKLM 中的配置单元 TempHive
复制代码
REG COMPARE /?  compare(比较),用来比较具体的项、键名、键值和另一个具体的项、键名、键值。
例子:
  1. REG COMPARE HKLM\Software\MyCo\MyApp HKLM\Software\MyCo\SaveMyApp
  2.   将注册表项 MyApp 下的所有值跟 SaveMyApp 比较
复制代码
REG EXPORT /?  export(输出),用来保存具体的项、键名、键值,到以reg为扩展名的文件中。(常说的“备份注册表”就是这个了)
例子:
  1. REG EXPORT HKLM\Software\MyCo\MyApp AppBkUp.reg
  2.   将注册表项 MyApp 的所有子项和值导出到文件 AppBkUp.reg
复制代码
REG IMPORT /?  import(输入),有备份就有还原,export的逆操作。(不需要加项,会自动添加到具体位置)
  1. REG IMPORT AppBkUp.reg
  2.   从文件 AppBkUp.reg 导入注册表项
复制代码
REG FLAGS /? flags(标识),密钥?
  1. REG FLAGS HKLM\Software\MyCo\MyApp QUERY
  2.   显示密钥 MyApp 的当前标志。
复制代码
扩展阅读:
1.注册表和注册表编辑器。
还是引那句拗口的话来说明,“reg命令可直接操作注册表,注册表是windows的数据库,所以关键不是reg而是注册表!但reg既然可以操作注册表,那么即便关键不是reg,那也是reg。”
同样的道理,
注册表编辑器可直接操作注册表,注册表是windows的数据库,所以关键不是注册表编辑器而是注册表!但注册表编辑器既然可以操作注册表,那么即便关键不是注册表编辑器,那也是注册表编辑器。


注册表编辑器就是个软件,软件名为regedit.exe,作用和reg命令一样都是用来操作注册表。
注册表是windows的数据库。

2.注册表主要的根键。
注册表有5个根键,分别是(括号中表示该根键所掌管的数据——有遗漏,无错误):
HKEY_CLASSES_ROOT(已在计算机上注册的所有com服务器和与应用程序相关联的所有文件扩展名)
HKEY_CURRENT_USER(当前用户配置信息)
HKEY_LOCAL_MACHINE(该计算机对于任意用户的配置信息,掌管数据最多)
HKEY_USERS(系统默认用户配置信息)
HKEY_CURRENT_CONFIG(硬件配置文件信息)

其中,HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG都是HKEY_LOCAL_MACHINE的子项,分别对应于HKEY_LOCAL_MACHINE\SOFTWARE\Classes、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet


3.键值的数据类型。
[ REG_SZ    | REG_MULTI_SZ | REG_EXPAND_SZ |
  REG_DWORD | REG_QWORD    | REG_BINARY    | REG_NONE ]

字符串值   
在注册表中,字符串值一般用来表示文件的描述、硬件的标识等。通常它由字母和数字组成,最大长度不能超过255个字符。通过键值名、键值就可以组成一种键值项数据,这就相当于Win.ini、Ssyt-em.ini文件中小节下的设置行。其实,使用注册表编辑器将这些键值项数据导出后,其形式与INI文件中的设置行完全相同。   

二进制值   
在注册表中,二进制值是没有长度限制的,可以是任意个字节长。在注册表编辑器中,二进制以十六进制的方式显示出来。

DWORD值   
DWORD值是一个32位(4个字节,即双字)长度的数值。在注册表编辑器中,您将发现系统会以十六进制的方式显示DWORD值,在编辑DWORD数值时,可以选择用十进制还是16进制的方式进行输入。
作者: Batcher    时间: 2011-9-9 18:49

是否可以增加一下几个方面?
1、给个具体例子说明/ve怎么用
2、百分号、双引号怎么转义
3、删除、导入、导出等怎么用

参考:http://bbs.bathome.net/thread-3747-1-1.html
作者: CrLf    时间: 2011-10-5 21:06

reg命令可直接操作注册表,注册表是windows的数据库,所以关键不是reg而是注册表!但reg既然可以操作注册表,那么即便关键不是reg,那也是reg。

好晕啊...
作者: zaixinxiangnian    时间: 2011-10-6 15:05

本帖最后由 zaixinxiangnian 于 2011-10-6 15:06 编辑

回复 1# Hello123World


    export 的输出的文件和REG文件有区别吗?
好像RGE这个命令可以编辑注册表文件了
作者: Hello123World    时间: 2011-10-6 15:29

回复 4# zaixinxiangnian
这种问题,随手自己就可以测试了……

没有差别,这是用export导出的reg文件。
  1. Windows Registry Editor Version 5.00
  2. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
  3. "QvodTerminal"="\"F:\\视频软件\\QvodPlayer\\QvodTerminal.exe\" -autorun"
  4. "qq"="F:\\腾讯软件\\qq\\qq.exe"
  5. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\QQDisabled]
复制代码
这是注册表手动导出的reg。
  1. Windows Registry Editor Version 5.00
  2. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
  3. "QvodTerminal"="\"F:\\视频软件\\QvodPlayer\\QvodTerminal.exe\" -autorun"
  4. "qq"="F:\\腾讯软件\\qq\\qq.exe"
  5. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\QQDisabled]
复制代码

作者: Hello123World    时间: 2011-10-6 15:31

恩,导出后的reg文件,可以不用import导入,可以直接双击导入。
作者: zaixinxiangnian    时间: 2011-10-6 16:31

回复 5# Hello123World


    偷个小懒了,所以没有试
   以后可以用批的EXPORT做注册表优化的注册表文件了
   问个不相关的问题 PB做什么用,是不是就是积分啊。查看新帖列表哪里,标题前面的图标是什么意思?
作者: Hello123World    时间: 2011-10-6 18:39

回复 7# zaixinxiangnian


    http://bbs.bathome.net/faq.php?action=credits
作者: zaixinxiangnian    时间: 2011-10-7 16:47

回复 8# Hello123World


我问的是这个火把等在这个位置的标志是什么意思
作者: cjiabing    时间: 2011-10-7 21:04

回复 9# zaixinxiangnian


    多看看论坛介绍帖,多上论坛发言,逐渐就懂了。
作者: cb02356828    时间: 2012-4-12 19:30

Hello123World 发表于 2011-9-9 17:26
/ve,全英文value(不肯定),意为:值;这里引申为值名。

这个是不是应该是 value empty 啊,因为它设的是空
作者: changedirectory    时间: 2013-9-21 17:47

  1. ::获取ie缓存文件夹位置
  2. set zcb=
  3. set hc=
  4. set weizhi=
  5. set "zcb=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
  6. for /f "tokens=1* delims=Z" %%i in ('reg query "%zcb%" /v cache') do set "weizhi=%%j"
  7. set "hc=%weizhi:~1%"
  8. for /f "tokens=* delims= " %%i in ("%hc%") do set "hc=%%i"
  9. echo ie缓存文件夹位置:%hc%
复制代码
能解释第8行有什么作用吗?谢谢!
for /f "tokens=* delims= " %%i in ("%hc%") do set "hc=%%i"
作者: cjiabing    时间: 2013-9-30 17:31

回复 12# changedirectory


    其实,命令可以简化为一行:
  1. @echo off &::获取ie缓存文件夹位置
  2. for /f "eol=! tokens=3*" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v cache') do echo %%i %%j
  3. pause>nul
复制代码

如果你想更直接点,可以使用:
  1. echo %USERPROFILE%\Local Settings\Temporary Internet Files
复制代码

它们的结果是一样的。另外:
  %TEMP%
  指向的是当前用户的临时文件目录,通常是C:\Documents and Settings\当前用户名\Local Settings\Temp。
  %TMP%
  与%TEMP%的指向相同。
作者: Tufeiheike    时间: 2014-9-10 21:45

感觉一遇到%就蛋疼,好搞不懂什么时候单%什么时候双%
作者: shelluserwlb    时间: 2014-11-3 14:34

本帖最后由 shelluserwlb 于 2014-11-3 14:37 编辑

回复 12# changedirectory


    for /f "tokens=* delims= " %%i in ("%hc%") do set "hc=%%i"
   
  上面这句话是清除前导空格以提取字符,例如原先hc="   abc ",执行后hc="abc"
例:
@echo off
set hc=  abc  
echo 原先:%hc%
for /f "tokens=* delims= " %%i in ("%hc%") do set "hc=%%i"
echo 提取:%hc%
pause
作者: 无忧    时间: 2017-5-17 11:41

版主,注册表的编辑支持简写么?比如HEKY_CLASSES_ROOT写成HKCR,以此类推 HKCU HKLM HCU HKCC。
还有就是注册表路径区分大小写么? 比如路径里写成HKLM\SOFTWARE\MICROSOFT\WINDOWS\…
作者: ShowCode    时间: 2017-5-17 11:51

回复 16# 无忧


    你自己做个试验就知道啦




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2