yjqd 发表于 2018-4-10 11:46:37

批处理修改注册表中的C:\和D:\为X:\,这个批处理怎么写呢

想用批处理修改注册表中的C:\和D:\为X:\,该如何写这个批处理

tt911 发表于 2018-4-10 12:02:00

键值 和 路径呢?

yjqd 发表于 2018-4-10 12:07:13

tt911 发表于 2018-4-10 12:02
键值 和 路径呢?

谢谢回复

不好意思
比如:


"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:49

注册表修改一般使用reg add命令
@echo off
set regpath="HKEY_LOCAL_MACHINE\CBSTEST"
reg add %regpath% /v CBSTestWDSLogFile /treg_sz /d "X:\BVTBin\Tests\installpackage\cbstest\x86\CBSTestWDS.log" /f
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:46

holley2008 发表于 2018-4-10 14:28
注册表修改一般使用reg add命令

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

谢谢回复

假如只知道项名称,比如:HKEY_LOCAL_MACHINE\CBSTEST
怎么搜索出有D:\的数据并修改为X:\

holley2008 发表于 2018-4-10 14:54:37

yjqd 发表于 2018-4-10 14:36
谢谢回复

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


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

yjqd 发表于 2018-4-11 10:26:55

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:27

yjqd 发表于 2018-4-11 10:26
谢谢回复

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

看的我一脸大写的懵逼{:2_130:}

nttwqz 发表于 2018-4-13 21:22:25

楼主,你的需要没有说清楚,你是想修改一些特定的注册表呢?还是需要遍历整个注册表?

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

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

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

这明显是个大工程,还是RegWorkshop来的简单。。。

yjqd 发表于 2018-4-13 22:46:50

nttwqz 发表于 2018-4-13 21:22
楼主,你的需要没有说清楚,你是想修改一些特定的注册表呢?还是需要遍历整个注册表?

如果是一些特定的 ...

谢谢回复

我自己运行批处理后,才发现数据读取出来容易,修改后要导进去太难了
比如要考虑扩充字符串、百分号等等

5027527 发表于 2018-5-27 13:36:20

新建文本文件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:09

用到gsar.exe 处理字符串,我从winbuilder中拿出来的。

610644034 发表于 2019-1-6 20:29:05

我来说说我修改 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文件 ,并导入注册表 ,卸载掉
感觉好快! 但是替换特别要注意输入的字符串,一字错了 全白干
页: [1]
查看完整版本: 批处理修改注册表中的C:\和D:\为X:\,这个批处理怎么写呢