无忧启动论坛

标题: 批处理修改注册表中的C:\和D:\为X:\,这个批处理怎么写呢 [打印本页]

作者: yjqd    时间: 2018-4-10 11:46
标题: 批处理修改注册表中的C:\和D:\为X:\,这个批处理怎么写呢
想用批处理修改注册表中的C:\和D:\为X:\,该如何写这个批处理
作者: tt911    时间: 2018-4-10 12:02
键值 和 路径呢?
作者: yjqd    时间: 2018-4-10 12:07
tt911 发表于 2018-4-10 12:02
键值 和 路径呢?

谢谢回复

不好意思
比如:

[HKEY_LOCAL_MACHINE\CBSTEST]
"CBSTestWDSLogFile"="D:\\BVTBin\\Tests\\installpackage\\cbstest\\x86\\CBSTestWDS.log"
"CBSTestWTTLogFile"="D:\\BVTBin\\Tests\\installpackage\\cbstest\\x86\\CBSTest-20101120-134853-784.wtl"
作者: holley2008    时间: 2018-4-10 14:28
注册表修改一般使用reg add命令
  1. @echo off
  2. set regpath="HKEY_LOCAL_MACHINE\CBSTEST"
  3. reg add %regpath% /v CBSTestWDSLogFile /t  reg_sz /d "X:\BVTBin\Tests\installpackage\cbstest\x86\CBSTestWDS.log" /f
  4. reg add %regpath% /v CBSTestWTTLogFile /t reg_sz /d "X:\BVTBin\Tests\installpackage\cbstest\x86\CBSTest-20101120-134853-784.wtl" /f
复制代码

根据需要修改并保存为bat运行即可。
作者: yjqd    时间: 2018-4-10 14:36
holley2008 发表于 2018-4-10 14:28
注册表修改一般使用reg add命令

根据需要修改并保存为bat运行即可。

谢谢回复

假如只知道项名称,比如:HKEY_LOCAL_MACHINE\CBSTEST
怎么搜索出有D:\的数据并修改为X:\
作者: holley2008    时间: 2018-4-10 14:54
yjqd 发表于 2018-4-10 14:36
谢谢回复

假如只知道项名称,比如:HKEY_LOCAL_MACHINE\CBSTEST


这就需要用到reg query命令 。判断并修改即可。
比如:
  1. @echo off
  2. set regpath=HKEY_LOCAL_MACHINE\CBSTEST
  3. REG QUERY %regpath% /s|find "D:\"
  4. IF ERRORLEVEL 1 (
  5.   echo 此路径没有"D:\".
  6. ) ELSE (
  7.   reg add xxxxxxxxxxx
  8. )
复制代码

作者: yjqd    时间: 2018-4-11 10:26
holley2008 发表于 2018-4-10 14:54
这就需要用到reg query命令 。判断并修改即可。
比如:

谢谢回复

由于reg对注册表的操作要求特别多,批处理要考虑的方面特别多,并且如果要修改的地方多,批处理修改就较慢

昨天花了两个多小时才写了一个批处理,运行时出错很多

for /f "tokens=1,2,* delims= " %%a in ('REG QUERY HKLM\1 /S /F D:\^|findstr /v "搜索结束:"') do (
echo %%a|find "HKEY_LOCAL_MACHINE\1">nul&&set w=%%a
echo %%a|find "(默认)">nul&&set x=%%a&&set x=/ve||set x=/v %%a
set y=%%b
echo %%c|find "D:">nul&&set z=%%c
echo !w! !x! /t !y! /d !z!|find "D:">nul&&set z=!z:D:\=X:\!&&echo y|REG ADD !w! !x! /t !y! /d "!z!" /F
)
作者: holley2008    时间: 2018-4-12 10:21
yjqd 发表于 2018-4-11 10:26
谢谢回复

由于reg对注册表的操作要求特别多,批处理要考虑的方面特别多,并且如果要修改的地方多,批 ...

看的我一脸大写的懵逼
作者: nttwqz    时间: 2018-4-13 21:22
楼主,你的需要没有说清楚,你是想修改一些特定的注册表呢?还是需要遍历整个注册表?

如果是一些特定的注册表,这个比较好弄。

如果是整个注册表,这个对于批处理来说比较麻烦,这涉及到

1. 尽可能的遍历整个注册表,查找含有相关字符的注册表,依据找到的数据判断所在的项,提取该键值所在项名,然后才是修改值。
2. 对于不能访问的注册表项,还需要调整权限
3. 鉴于修改的数量级比较大,可能需要加入日志系统,输出错误日志

这明显是个大工程,还是RegWorkshop来的简单。。。
作者: yjqd    时间: 2018-4-13 22:46
nttwqz 发表于 2018-4-13 21:22
楼主,你的需要没有说清楚,你是想修改一些特定的注册表呢?还是需要遍历整个注册表?

如果是一些特定的 ...

谢谢回复

我自己运行批处理后,才发现数据读取出来容易,修改后要导进去太难了
比如要考虑扩充字符串、百分号等等
作者: 5027527    时间: 2018-5-27 13:36
新建文本文件SearchReplaceReg-list.txt,内容如下:
HKLM\Tmp_Software#c:\#x:\#-i
HKLM\Tmp_Software#d:\#x:\#-i
HKLM\Tmp_Software#$windows.~bt\#""#-i

新建批处理SearchReplaceRegFromTxtFile.cmd ,内容如下:
::SearchReplaceRegsFromTxtFile SearchReplaceReg.txt

:main
  @echo off
  set result=
  echo.
  echo 已进入%~f0
  echo ==========================================================================

  if "%1" EQU "" (
    echo target file can't be empty.
    call:end&goto:eof
  )

  if not exist %1 (
    echo not exit %1
    call:end&goto:eof
  )

  for /f "tokens=1,2,3,4* delims=#" %%i in (%1) do (
    if %%k EQU "" (
      echo call SearchReplaceReg "%%i" "%%j" %%k %%l ...
      call SearchReplaceReg "%%i" "%%j" %%k %%l
    ) else (
      echo call SearchReplaceReg "%%i" "%%j" "%%k" %%l ...
      call SearchReplaceReg "%%i" "%%j" "%%k" %%l
    )
  )

  set result=true&call:end&goto:eof

:end
  echo.
  echo 已退出%~f0
  echo.
  goto:eof

新建批处理SearchReplaceReg.cmd,内容如下:
::SearchReplaceReg.cmd "HKLM\Tmp_Software" "c:\" "x:\" -i

:main
  @echo off
  set result=
  echo.
  echo 已进入%~f0
  echo ==========================================================================

  if "%1" EQU "" (
    echo HK can't be emtpy.
    call:end&goto:eof
  )

  if "%2" EQU "" (
    echo SearchStr can't be emtpy.
    call:end&goto:eof
  )

  if "%3" EQU "" (
    echo SearchStr can't be emtpy.
    call:end&goto:eof
  )

  setlocal enabledelayedexpansion
  set SearchResultFile=%temp%\%random%.txt
  if exist %SearchResultFile% del %SearchResultFile%
  set SearchStr=%2
  set ReplaceStr=%3
  set SearchStr=%SearchStr:\=\\%
  set ReplaceStr=%ReplaceStr:\=\\%

  if "%4" EQU "-i" ( set gIgnoreCase=-i && set rIgnoreCase= ) else (set gIgnoreCase= && set rIgnoreCase=/c)

  echo reg query %1 /f %2 /d /s %rIgnoreCase% output to %SearchResultFile% ...
  reg query %1 /f %SearchStr% /d /s %rIgnoreCase% >%SearchResultFile%
  gsar -s"    " -r` -o %SearchResultFile%

  set c=:
  set d=::
  set SearchStr=!SearchStr:%c%=%d%!
  set ReplaceStr=!ReplaceStr:%c%=%d%!
  gsar -s%SearchStr% -r%ReplaceStr% -o %SearchResultFile% %gIgnoreCase%

  set /a n=0
  for /f "tokens=1,2,3* delims=`" %%i in (%SearchResultFile%) do (
    if "%%j" EQU ""  (set key=%%i) else (
       if "!key!" NEQ "搜索结束:" (
           set data=%%k
           if "!data:~-1!" EQU "\" set data=!data!\
           set data=!data:"=\"!
           if "%%i" EQU "(默认)" (            
             echo reg add "!key!" /f /ve /t %%j /d "!data!"  ...
             reg add "!key!" /f /ve /t %%j /d "!data!"
           ) else (
             echo reg add "!key!" /f /v "%%i" /t %%j /d "!data!"  ...
             reg add "!key!" /f /v "%%i" /t %%j /d "!data!"
           )
       )
    )
  )
  endlocal&set result=true&call:end&goto:eof

:end
  echo.
  echo 已退出%~f0
  echo.
  goto:eof
作者: 5027527    时间: 2018-5-27 13:39
用到gsar.exe 处理字符串,我从winbuilder中拿出来的。
作者: 610644034    时间: 2019-1-6 20:29
我来说说我修改 D:\为X:\ 的方法:
1.加载注册表项
2.注册表编辑器获取包括子目录的所有权限
3.导出注册表到 x.reg 文件
4.删除注册表所有子目录
5.记事本打开 x.reg
6.打开记事本的 编辑 - 替换
  查找内容 D:\
  替换为   X:\
  选择不区分到小写
  点上 全部替换
.....
替换 C:\
一样用这个办法!
但是我又多了4项替换
43,00,3a,00,5c,00 替换成 58,00,3a,00,5c,00
63,00,3a,00,5c,00 替换成 58,00,3a,00,5c,00
44,00,3a,00,5c,00 替换成 58,00,3a,00,5c,00
64,00,3a,00,5c,00 替换成 58,00,3a,00,5c,00

7.最后保存 reg文件 ,并导入注册表 ,卸载掉
感觉好快! 但是替换特别要注意输入的字符串,一字错了 全白干





欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3