[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何替换文本中指定行的内容??

如题,我有一段注册表文件,需要用批处理导入到注表册中,但是该注册表在32位和64位系统下的路径不同,所以用批处理导入前必须处理一下:
32位的路径是[HKEY_LOCAL_MACHINE\SOFTWARE\Le]    64位的路径是:[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Le],
前面做个版本判断,根据版本把相对应的路径值赋予给变量X,再把变量X替换注册表文件中的路径即可。可是在替换的时候出现问题:
注册表文件内容是这样的:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Le]
"x"=ss="
"li"="Rf"
"jur"="6WHrtyr"
"llxj"="pW"

需要把注册表文件的第三行替换成相应的路径,在网上找的代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (xyzc.txt) do (
  3.    set /a num+=1
  4.    if !num!==3 (echo b=4567) else echo %%a
  5. )>>temp.txt
  6. move temp.txt xyzc.txt
  7. pause
复制代码
该代码在一般情况下确实可以进行指定行的内容替换工作,但是用在我上面的注册表文件中却行不通,因为运行后,批处理会把空行删除,然后再进行替换,这样一来,原本的第二行就没有了,第三行变成了第二行,第四行变成了第三行,替换的效果如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Le]
[HKEY_LOCAL_MACHINE\SOFTWARE\Le]
"li"="Rf"
"jur"="6WHrtyr"
"llxj"="pW"

根本达不到我想要的结果,有没有大神教教我这个批处理要怎么写才能不管前面有没有空行都能正确的替换我指定的行的内容??

回复 5# WHY


    又学习了一招,宛美解决,只是如果方便 的话能不能给我解释一下这个命令么?还有后面的参数的意义,有点不太懂

TOP

先来个PS 和 P 的混合体
  1. $str = '[HKEY_LOCAL_MACHINE\SOFTWARE\Le]';
  2. if ($env:ProgramW6432){$str='[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Le]'};
  3. ni "$env:temp\xxx.reg" -type file -force;
  4. gc "$pwd\reg.txt" | ?{ if ($_ -match '^\[HEKY.+Le\]$' ) {
  5. $STR|ac "$env:temp\xxx.reg" } else { $_|ac "$env:temp\xxx.reg" }
  6. };
  7. Start-Process "$pshome\powershell.exe" -argumentlist "-NoProfile -command `
  8. cmd /c regedit /s '$env:temp\xxx.reg' `
  9. del '$env:temp\xxx.reg' -Force" -verb runas;
  10. pause;
复制代码
纯 PS
  1. $str = 'SOFTWARE\Le';
  2. if ($env:ProgramW6432){$str = 'SOFTWARE\Wow6432Node\Le'};
  3. Start-Process "$pshome\powershell.exe" -argumentlist "-NoProfile -command `
  4. md hklm:$str; cd hklm:$str `
  5. New-ItemProperty . -name 'x' -Value 'ss' `
  6. New-ItemProperty . -name 'li' -Value 'RF' `
  7. New-ItemProperty . -name 'jur' -Value '6WHrtyr' `
  8. New-ItemProperty . -name 'llxj' -Value 'pW'" -Verb runas;
  9. pause;
复制代码

TOP

回复 4# z18137


你的.reg文件是Unicode编码吧?2楼第7行改成这样试试可以吗:
>"tmp.file" (for /f "tokens=1* delims=:" %%a in ('type "注册表文件.reg" ^| findstr /n .*') do (
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 WHY 于 2019-2-12 13:50 编辑

没必要判断系统位数,也没必要修改reg文本内容
  1. reg import 1.reg /reg:32
复制代码
64位系统的话,1.reg 中的注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Le 会自动重定向写入到注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Le
reg import 可能需要管理员权限
1

评分人数

    • z18137: 谢谢,完美解决!技术 + 1

TOP

yhcfsr 发表于 2019-2-12 00:29



    亲测无效,是乱码。。。。

TOP

本帖最后由 aries215 于 2019-2-12 06:01 编辑

回复 2# yhcfsr
x84?多少钱买的?
http://www.bathome.net/thread-30883-1-1.html

TOP

本帖最后由 yhcfsr 于 2019-2-12 16:01 编辑
  1. @echo off
  2. echo;%PROCESSOR_ARCHITECTURE%|find "x86"&&(
  3. set "rpath=[HKEY_LOCAL_MACHINE\SOFTWARE\Le]")||(
  4. set "rpath=[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Le]")
  5. >"tmp.file" (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "注册表文件.reg"') do (
  6. if %%a==3 (echo;%rpath%) else (echo;%%b)
  7. ))
  8. move /y "tmp.file" "注册表文件.reg"
复制代码
QQ 33892006

TOP

返回列表