找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 85755|回复: 19

[文本处理] 求助,批处理如何修改ini文件的指定键值对?

[复制链接]
发表于 2017-3-21 17:53:07 | 显示全部楼层 |阅读模式
[Path]
;产品名
Project=I7
;分支号
Branch=R1.2
;产品名+分支号
ProBranch=I7_R1.2
;源文件路径
SourcePath=H:\i7standard\I7_R1.2\Platform\UI\bin\Release\
;需更新文件路径
NeedUpdatePath=H:\i7standard\I7_R1.2\



这是test.ini文件的全部内容,如何将SourcePath和NeedUpdatePath的值修改为c:\windows
发表于 2017-3-21 19:40:02 | 显示全部楼层
回复 1# yym黄诗瑶
  1. @echo off

  2. set rip=c:\windows

  3. set tihuan1=SourcePath=
  4. set tihuan2=NeedUpdatePath=

  5. echo %tihuan1%
  6. echo %tihuan2%
  7. pause

  8. del /f /q new.ini

  9. findstr /n .* 1.ini>temp.ini
  10. for /f "tokens=1* delims=:" %%a in ('findstr /b /n %tihuan1% 1.ini') do (
  11.         set /a tn=%%a
  12.         for /f "tokens=2 delims==" %%c in ("%%b") do set tip=%%c
  13. )
  14. setlocal enabledelayedexpansion
  15. for /f "tokens=1* delims=:" %%i in (temp.ini) do (
  16.         set /a ln=%%i
  17.         set line=%%j
  18.         if !ln! equ !tn! (
  19.         echo;!line:%tip%=%rip%!
  20.         ) else (
  21.         echo;!line!
  22.         )
  23. )>>new.ini


  24. 1pause
  25. del /q 1.ini
  26. ren new.ini 1.ini


  27. 1pause
  28. del /f /q temp.ini





  29. findstr /n .* 1.ini>temp.ini
  30. for /f "tokens=1* delims=:" %%a in ('findstr /b /n %tihuan2% 1.ini') do (
  31.         set /a tn=%%a
  32.         for /f "tokens=2 delims==" %%c in ("%%b") do set tip=%%c
  33. )
  34. setlocal enabledelayedexpansion
  35. for /f "tokens=1* delims=:" %%i in (temp.ini) do (
  36.         set /a ln=%%i
  37.         set line=%%j
  38.         if !ln! equ !tn! (
  39.         echo;!line:%tip%=%rip%!
  40.         ) else (
  41.         echo;!line!
  42.         )
  43. )>>new.ini


  44. 1pause
  45. del /q 1.ini
  46. ren new.ini 1.ini


  47. 1pause
  48. del /f /q temp.ini


  49. 1pause
  50. exit

复制代码
发表于 2017-3-21 22:13:39 | 显示全部楼层
回复 2# ygqiang


这样比较简洁
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1* delims=:" %%h in ('findstr /n "." "1.ini"') do (
  4.     set "str=%%i"
  5.     if "!str:SourcePath=!" neq "%%i" (
  6.         echo SourcePath=C:\Windows
  7.     ) else if "!str:NeedUpdatePath=!" neq "%%i" (
  8.         echo NeedUpdatePath=C:\Windows
  9.     ) else (
  10.         echo,%%i
  11.     )
  12. ))>"2.ini"
复制代码
发表于 2017-3-22 01:42:25 | 显示全部楼层
本帖最后由 codegay 于 2017-3-22 01:49 编辑

回复 3# ShowCode


    INI文件的格式是:
  1. [节点]
  2. 选项=xxx
复制代码
用等号定位比较靠谱。冒号不是必然会出现的。
发表于 2017-3-22 08:32:26 | 显示全部楼层
本帖最后由 codegay 于 2017-3-22 08:36 编辑

回复 1# yym黄诗瑶


    你们的打包安装程序用的是什么工具?Inno ?还是NSIS?
这类工具是集成了对INI文件的读写的功能的。如果是安装过程中进行处理,完全可以交给安装程序来处理。
INNO的文档如下:
  1. [INI]
  2. Filename: "MyProg.ini"; Section: "InstallSettings"; Flags: uninsdeletesection
  3. Filename: "MyProg.ini"; Section: "InstallSettings"; Key: "InstallPath"; String: "{app}"
复制代码
少部分系统目录不是c:\windows , 用系统变量systemroot可能是比较靠谱,可以规避掉这种可能是的意外。
发表于 2017-3-22 10:16:38 | 显示全部楼层
回复 4# codegay


    冒号是 findstr 生成的,跟 ini 文件没啥关系吧。
 楼主| 发表于 2017-3-22 10:43:27 | 显示全部楼层
回复 5# codegay

是在打包之前要进行批量修改,所以写在nsi里面达不到我的需求
 楼主| 发表于 2017-3-22 10:48:33 | 显示全部楼层
回复 3# ShowCode


    有用,只是分号注释部分有的会乱码
发表于 2017-3-22 10:59:05 | 显示全部楼层
回复 8# yym黄诗瑶


    你需要说明INI的文本编码
发表于 2017-3-22 10:59:23 | 显示全部楼层
应该是UTF8的吧。、
发表于 2017-3-22 11:23:48 | 显示全部楼层
  1. powershell "(gc 'test.ini') -replace '(?<=^\s*?(SourcePath|NeedUpdatePath)\s*?=).*','c:\windows'"&pause
复制代码
发表于 2017-3-22 11:38:49 | 显示全部楼层
回复 8# yym黄诗瑶


用记事本打开原始的ini
文件
另存为
选择 ANSI 编码
再执行批处理脚本试试
发表于 2017-3-22 11:49:27 | 显示全部楼层
回复 1# yym黄诗瑶
So easy
  1. @echo off&setlocal enabledelayedexpansion
  2. chcp 65001
  3. (
  4.         for /f "delims= eol=" %%a in (src.ini) do (
  5.                 2>NUL set "%%a" && (
  6.                         if defined SourcePath (
  7.                                 echo;SourcePath=C:\Windows
  8.                                 set SourcePath=
  9.                         ) else if defined NeedUpdatePath (
  10.                                 echo;NeedUpdatePath=C:\Windows
  11.                                 set NeedUpdatePath=
  12.                         ) else (
  13.                                 echo;%%a
  14.                         )
  15.                 ) || (
  16.                         echo;%%a
  17.                 )               
  18.         )
  19. )>.\new.ini
  20. chcp 936
  21. start .\new.ini
复制代码
发表于 2017-3-22 18:02:40 | 显示全部楼层
研究了一下没怎么看看懂

如果有哪里不懂的话,可以回帖提问。
 楼主| 发表于 2017-3-22 18:07:56 | 显示全部楼层
回复 3# ShowCode


    没有明白你的思路,for /f "tokens=1* delims=:" %%h in ('findstr /n "." "1.ini"') do echo %%h  就是打印这个文本有多少行,
   for /f "tokens=1* delims=:" %%h in ('findstr /n "." "1.ini"') do  echo %%i 就是把我文本整个打印出来了
,后面你 set "str=%%i"没懂,"!str:SourcePath=!"这个也没懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:10 , Processed in 0.024215 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表