标题: [文本处理] 求助,批处理如何修改ini文件的指定键值对? [打印本页]
作者: yym黄诗瑶 时间: 2017-3-21 17:53 标题: 求助,批处理如何修改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
作者: ygqiang 时间: 2017-3-21 19:40
回复 1# yym黄诗瑶 - @echo off
-
- set rip=c:\windows
-
- set tihuan1=SourcePath=
- set tihuan2=NeedUpdatePath=
-
- echo %tihuan1%
- echo %tihuan2%
- pause
-
- del /f /q new.ini
-
- findstr /n .* 1.ini>temp.ini
- for /f "tokens=1* delims=:" %%a in ('findstr /b /n %tihuan1% 1.ini') do (
- set /a tn=%%a
- for /f "tokens=2 delims==" %%c in ("%%b") do set tip=%%c
- )
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in (temp.ini) do (
- set /a ln=%%i
- set line=%%j
- if !ln! equ !tn! (
- echo;!line:%tip%=%rip%!
- ) else (
- echo;!line!
- )
- )>>new.ini
-
-
- 1pause
- del /q 1.ini
- ren new.ini 1.ini
-
-
- 1pause
- del /f /q temp.ini
-
-
-
-
-
- findstr /n .* 1.ini>temp.ini
- for /f "tokens=1* delims=:" %%a in ('findstr /b /n %tihuan2% 1.ini') do (
- set /a tn=%%a
- for /f "tokens=2 delims==" %%c in ("%%b") do set tip=%%c
- )
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in (temp.ini) do (
- set /a ln=%%i
- set line=%%j
- if !ln! equ !tn! (
- echo;!line:%tip%=%rip%!
- ) else (
- echo;!line!
- )
- )>>new.ini
-
-
- 1pause
- del /q 1.ini
- ren new.ini 1.ini
-
-
- 1pause
- del /f /q temp.ini
-
-
- 1pause
- exit
复制代码
作者: ShowCode 时间: 2017-3-21 22:13
回复 2# ygqiang
这样比较简洁- @echo off
- setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%h in ('findstr /n "." "1.ini"') do (
- set "str=%%i"
- if "!str:SourcePath=!" neq "%%i" (
- echo SourcePath=C:\Windows
- ) else if "!str:NeedUpdatePath=!" neq "%%i" (
- echo NeedUpdatePath=C:\Windows
- ) else (
- echo,%%i
- )
- ))>"2.ini"
复制代码
作者: codegay 时间: 2017-3-22 01:42
本帖最后由 codegay 于 2017-3-22 01:49 编辑
回复 3# ShowCode
INI文件的格式是:复制代码
用等号定位比较靠谱。冒号不是必然会出现的。
作者: codegay 时间: 2017-3-22 08:32
本帖最后由 codegay 于 2017-3-22 08:36 编辑
回复 1# yym黄诗瑶
你们的打包安装程序用的是什么工具?Inno ?还是NSIS?
这类工具是集成了对INI文件的读写的功能的。如果是安装过程中进行处理,完全可以交给安装程序来处理。
INNO的文档如下:- [INI]
- Filename: "MyProg.ini"; Section: "InstallSettings"; Flags: uninsdeletesection
- Filename: "MyProg.ini"; Section: "InstallSettings"; Key: "InstallPath"; String: "{app}"
复制代码
少部分系统目录不是c:\windows , 用系统变量systemroot可能是比较靠谱,可以规避掉这种可能是的意外。
作者: ShowCode 时间: 2017-3-22 10:16
回复 4# codegay
冒号是 findstr 生成的,跟 ini 文件没啥关系吧。
作者: yym黄诗瑶 时间: 2017-3-22 10:43
回复 5# codegay
是在打包之前要进行批量修改,所以写在nsi里面达不到我的需求
作者: yym黄诗瑶 时间: 2017-3-22 10:48
回复 3# ShowCode
有用,只是分号注释部分有的会乱码
作者: codegay 时间: 2017-3-22 10:59
回复 8# yym黄诗瑶
你需要说明INI的文本编码
作者: codegay 时间: 2017-3-22 10:59
应该是UTF8的吧。、
作者: pcl_test 时间: 2017-3-22 11:23
- powershell "(gc 'test.ini') -replace '(?<=^\s*?(SourcePath|NeedUpdatePath)\s*?=).*','c:\windows'"&pause
复制代码
作者: ShowCode 时间: 2017-3-22 11:38
回复 8# yym黄诗瑶
用记事本打开原始的ini
文件
另存为
选择 ANSI 编码
再执行批处理脚本试试
作者: happy886rr 时间: 2017-3-22 11:49
回复 1# yym黄诗瑶
So easy- @echo off&setlocal enabledelayedexpansion
- chcp 65001
- (
- for /f "delims= eol=" %%a in (src.ini) do (
- 2>NUL set "%%a" && (
- if defined SourcePath (
- echo;SourcePath=C:\Windows
- set SourcePath=
- ) else if defined NeedUpdatePath (
- echo;NeedUpdatePath=C:\Windows
- set NeedUpdatePath=
- ) else (
- echo;%%a
- )
- ) || (
- echo;%%a
- )
- )
- )>.\new.ini
- chcp 936
- start .\new.ini
复制代码
作者: ShowCode 时间: 2017-3-22 18:02
如果有哪里不懂的话,可以回帖提问。
作者: yym黄诗瑶 时间: 2017-3-22 18:07
回复 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=!"这个也没懂
作者: ShowCode 时间: 2017-3-22 18:16
回复 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
作者: 老刘1号 时间: 2017-3-22 19:06
本帖最后由 老刘1号 于 2017-3-22 19:11 编辑
我还就不用批了
另存为INF- [Version]
- Signature="$Chicago$"
- [DefaultInstall]
- UpdateInis=2333
- [2333]
- %01%\Test.ini,Path,SourcePath=2333,SourcePath=%10%
- %01%\Test.ini,Path,NeedUpdatePath=2333,NeedUpdatePath=%10%
复制代码
作者: 老刘1号 时间: 2017-3-22 19:24
本帖最后由 老刘1号 于 2017-3-22 23:02 编辑
回复 5# codegay
很巧,INF也是安装工具
INI文件修改是INF为数不多的实用功能之一
作者: zuodx 时间: 2017-3-25 13:30
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
作者: yym黄诗瑶 时间: 2017-9-28 14:20
回复 16# ShowCode - set ListenPort=0
- set IsSupport=0
- goto dealmanager1
- set EableCall=1
- set EableOneMoreCall=1
- set Eable60P=0
- goto dealmanager2
- set Conference_Module=Meeting
- goto dealmanager3
- :dealmanager1
- (for /f " delims=:" %%h in ('findstr /n "." "!SourcePath!\Config\CoreDefConfig.ini"') do (
- set "str=%%i"
- if "!str:ListenPort=!" neq "%%i" (
- echo ListenPort=!ListenPort!
- ) else if "!str:IsSupport=!" neq "%%i" (
- echo IsSupport=!IsSupport!
- ) else (
- echo,%%i
- )
- ))>"!SourcePath!\Config\2.ini"
- del "!SourcePath!\Config\CoreDefConfig.ini"
- rename "!SourcePath!\Config\2.ini" "CoreDefConfig.ini"
- :dealmanager2
- (for /f "tokens=1* delims=:" %%h in ('findstr /n "." "!SourcePath!\Config\I7DefConfig.ini"') do (
- set "str=%%i"
- if "!str:EableCall=!" neq "%%i" (
- echo EableCall=!EableCall!
- ) else if "!str:EableOneMoreCall=!" neq "%%i" (
- echo EableOneMoreCall=!EableOneMoreCall!
- ) else if "!str:Eable60P=!" neq "%%i" (
- echo Eable60P=!Eable60P!
- ) else (
- echo,%%i
- )
- ))>"!SourcePath!\Config\3.ini"
- del "!SourcePath!\Config\I7DefConfig.ini"
- rename "!SourcePath!\Config\3.ini" "I7DefConfig.ini"
-
- :dealmanager3
- (for /f "tokens=1* delims=:" %%h in ('findstr /n "." "!SourcePath!\Module.ini"') do (
- set "str=%%i"
- if "!str:Conference_Module=!" neq "%%i" (
- echo Conference_Module=!Conference_Module!
- ) else (
- echo,%%i
- )
- ))>"!SourcePath!\4.ini"
- del "!SourcePath!\Module.ini"
- rename "!SourcePath!\4.ini" "Module.ini"
复制代码
也是替换文本,只有第一个dealmanager1修改成功,第二个dealmanager2修改失败,等号后面没有值,为空,第三个deal也有问题,很奇怪。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |