Board logo

标题: [文本处理] 批处理如何替换文本中指定行的内容?? [打印本页]

作者: z18137    时间: 2019-2-11 23:13     标题: 批处理如何替换文本中指定行的内容??

如题,我有一段注册表文件,需要用批处理导入到注表册中,但是该注册表在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"

根本达不到我想要的结果,有没有大神教教我这个批处理要怎么写才能不管前面有没有空行都能正确的替换我指定的行的内容??
作者: yhcfsr    时间: 2019-2-12 00:29

本帖最后由 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"
复制代码

作者: aries215    时间: 2019-2-12 05:49

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

回复 2# yhcfsr
x84?多少钱买的?
http://www.bathome.net/thread-30883-1-1.html
作者: z18137    时间: 2019-2-12 11:45

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



    亲测无效,是乱码。。。。
作者: WHY    时间: 2019-2-12 13:47

本帖最后由 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 可能需要管理员权限
作者: Batcher    时间: 2019-2-12 13:55

回复 4# z18137


你的.reg文件是Unicode编码吧?2楼第7行改成这样试试可以吗:
>"tmp.file" (for /f "tokens=1* delims=:" %%a in ('type "注册表文件.reg" ^| findstr /n .*') do (
作者: xczxczxcz    时间: 2019-2-12 16:53

先来个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;
复制代码

作者: z18137    时间: 2019-2-13 11:00

回复 5# WHY


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




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