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

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

[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

回复 16# ShowCode
  1. set ListenPort=0
  2. set IsSupport=0
  3. goto dealmanager1  
  4. set EableCall=1
  5. set EableOneMoreCall=1
  6. set Eable60P=0
  7. goto dealmanager2
  8. set Conference_Module=Meeting
  9. goto dealmanager3
  10. :dealmanager1
  11. (for /f " delims=:" %%h in ('findstr /n "." "!SourcePath!\Config\CoreDefConfig.ini"') do (
  12.     set "str=%%i"
  13.     if "!str:ListenPort=!" neq "%%i" (
  14.         echo ListenPort=!ListenPort!
  15.     ) else if "!str:IsSupport=!" neq "%%i" (
  16.         echo IsSupport=!IsSupport!
  17.     ) else (
  18.         echo,%%i
  19.     )
  20. ))>"!SourcePath!\Config\2.ini"
  21. del "!SourcePath!\Config\CoreDefConfig.ini"
  22. rename "!SourcePath!\Config\2.ini" "CoreDefConfig.ini"
  23. :dealmanager2
  24. (for /f "tokens=1* delims=:" %%h in ('findstr /n "." "!SourcePath!\Config\I7DefConfig.ini"') do (
  25.     set "str=%%i"
  26.     if "!str:EableCall=!" neq "%%i" (
  27.         echo EableCall=!EableCall!
  28.     ) else if "!str:EableOneMoreCall=!" neq "%%i" (
  29.         echo EableOneMoreCall=!EableOneMoreCall!
  30.     )  else if "!str:Eable60P=!" neq "%%i" (
  31.         echo Eable60P=!Eable60P!
  32.     ) else (
  33.         echo,%%i
  34.     )
  35. ))>"!SourcePath!\Config\3.ini"
  36. del "!SourcePath!\Config\I7DefConfig.ini"
  37. rename "!SourcePath!\Config\3.ini" "I7DefConfig.ini"
  38. :dealmanager3
  39. (for /f "tokens=1* delims=:" %%h in ('findstr /n "." "!SourcePath!\Module.ini"') do (
  40.     set "str=%%i"
  41.     if "!str:Conference_Module=!" neq "%%i" (
  42.         echo Conference_Module=!Conference_Module!
  43.     ) else (
  44.         echo,%%i
  45.     )
  46. ))>"!SourcePath!\4.ini"
  47. del "!SourcePath!\Module.ini"
  48. rename "!SourcePath!\4.ini" "Module.ini"
复制代码
也是替换文本,只有第一个dealmanager1修改成功,第二个dealmanager2修改失败,等号后面没有值,为空,第三个deal也有问题,很奇怪。

TOP

D:\tmp>perl -lpe "   $_ = $1. '=c:\windows'  if( m/(SourcePath|NeedUpdatePath)/ )   "  test.ini
[Path]
;产品名
Project=I7
;分支号
Branch=R1.2
;产品名+分支号
ProBranch=I7_R1.2
;源文件路径
SourcePath=c:\windows
;需更新文件路径
NeedUpdatePath=c:\windows

TOP

本帖最后由 老刘1号 于 2017-3-22 23:02 编辑

回复 5# codegay


   很巧,INF也是安装工具
INI文件修改是INF为数不多的实用功能之一

TOP

本帖最后由 老刘1号 于 2017-3-22 19:11 编辑

我还就不用批了
另存为INF
  1. [Version]
  2. Signature="$Chicago$"
  3. [DefaultInstall]
  4. UpdateInis=2333
  5. [2333]
  6. %01%\Test.ini,Path,SourcePath=2333,SourcePath=%10%
  7. %01%\Test.ini,Path,NeedUpdatePath=2333,NeedUpdatePath=%10%
复制代码

TOP

回复 15# yym黄诗瑶


for /f %%h ... 这种命令会导致 ini 文件里面分号开头的行被忽略
findstr /n "." "1.ini" 的目的是为了在每行开头加上行号和冒号
for /f "tokens=1* delims=:" %%h ... 以冒号作为分隔符,%%h获取到行号(在本例中没有用处),%%i获取到剩余内容(也就是ini文件原始内容)
set "str=%%i" 变量str里面保存的就是ini某一行的内容

"!str:SourcePath=!" 本身是一个字符串替换,意思把变量str里面SourcePath这个字符串替换为空
if "!str:SourcePath=!" neq "%%i" 是为了判断该行内容是否包含字符串 SourcePath

TOP

回复 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=!"这个也没懂

TOP

研究了一下没怎么看看懂

如果有哪里不懂的话,可以回帖提问。

TOP

回复 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
复制代码

TOP

回复 8# yym黄诗瑶


用记事本打开原始的ini
文件
另存为
选择 ANSI 编码
再执行批处理脚本试试

TOP

  1. powershell "(gc 'test.ini') -replace '(?<=^\s*?(SourcePath|NeedUpdatePath)\s*?=).*','c:\windows'"&pause
复制代码

TOP

应该是UTF8的吧。、
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 8# yym黄诗瑶


    你需要说明INI的文本编码
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 3# ShowCode


    有用,只是分号注释部分有的会乱码

TOP

回复 5# codegay

是在打包之前要进行批量修改,所以写在nsi里面达不到我的需求

TOP

返回列表