Board logo

标题: [文本处理] BAT批处理怎样读取ini内容设置变量? [打印本页]

作者: zhong365    时间: 2014-5-30 10:57     标题: BAT批处理怎样读取ini内容设置变量?

  1. [ThisIp]
  2. tcpip001=192.168.1.10;192.168.1.1
  3. tcpip002=192.168.2.20;192.168.2.1
  4. tcpip003=192.168.3.30;192.168.3.1
  5. tcpip004=192.168.4.40;192.168.4.1
复制代码
如上图,我要实现从这个ini文件获取第二行 末位数值。。
也就是tcpip001=192.168.1.10;192.168.1.1 的末位数值
并判断
如果末位 是1   就更改成 2
如果末位 是2   就更改成 1

该行主要是有 =  ;  分隔符 所以不怎么会弄。。原来解答的人希望可以讲解下代码。
作者: DAIC    时间: 2014-5-30 11:15

把文件内容发出来,不要截图。
作者: zhong365    时间: 2014-5-30 14:43

回复 2# DAIC


    已经把文字补上去了,希望你可以帮帮忙!!
作者: gavinchou    时间: 2014-5-30 15:16

for /f "tokens=1,2,3,4,5,6,7,8* delims=." %%a in (ip.txt) do (
    if  "%%h" equ "1" (
        echo %%a.%%b.%%c.%%d;%%e.%%f.%%g.2%%i>>newFile.txt
    ) else (
        if  "%%h" equ "2" (
             echo %%a.%%b.%%c.%%d;%%e.%%f.%%g.1%%i>>newFile.txt
        ) else (
              %%a.%%b.%%c.%%d;%%e.%%f.%%g.1%%i>>newFile.txt
        )
    )
)
rem ren ip.txt
你按照这个思路改改,现在没空调试
作者: DAIC    时间: 2014-5-30 15:19

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. (for /f "delims=" %%i in (1.ini) do (
  5.     set "str=%%i"
  6.     set /a n+=1
  7.     if !n! == 2 (
  8.         if !str:~-1! == 1 (
  9.             echo,!str:~0,-1!2
  10.         ) else (
  11.             echo,!str:~0,-1!1
  12.         )
  13.     ) else (
  14.         echo,%%i
  15.     )
  16. ))>2.ini
复制代码

作者: apang    时间: 2014-5-30 15:29

  1. @echo off
  2. (for /f "delims=" %%a in ('findstr /n .* a.ini') do (
  3.     set "str=%%a"
  4.     setlocal enabledelayedexpansion
  5.     if "!str:~,2!!str:~-1!" == "2:1" (
  6.         echo,!str:~2,-1!2
  7.     ) else (
  8.         if "!str:~,2!!str:~-1!" == "2:2" (
  9.             echo,!str:~2,-1!1
  10.         ) else echo,!str:*:=!
  11.     )
  12.     endlocal
  13. ))>b.ini
  14. pause
复制代码

作者: zhong365    时间: 2014-5-31 14:54

回复 5# DAIC


    果然这里高手多,能解释一下那段替换代码吗?  如果是1 换成50   如果是50换成1 不知道怎么修改。

还有一个问题这样要必须生成一个新的INI文件,如果生成同名的 内容就空白了。

我举个例子。有一个程序运行必须调用D:\123\456.INI的参数。我运行批处理读取INI的内容 。如果tcpip=192.168.1.10;192.168.1.1 内容末位是 1  就将它改成50。
这样我运行该程序的时候就连接到192.168.1.50服务器。。  
运行批处理ini 末位 是50 就换成1 ,
作者: zhong365    时间: 2014-5-31 14:54

回复 6# apang


    还有一个问题这样要必须生成一个新的INI文件,如果生成同名的 内容就空白了。

我举个例子。有一个程序运行必须调用D:\123\456.INI的参数。我运行批处理读取INI的内容 。如果tcpip=192.168.1.10;192.168.1.1 内容末位是 1  就将它改成50。
这样我运行该程序的时候就连接到192.168.1.50服务器。。  
运行批处理ini 末位 是50 就换成1 ,
作者: apang    时间: 2014-5-31 22:21

本帖最后由 apang 于 2014-5-31 22:29 编辑

回复 8# zhong365


    更改第2行变量的值。ini文件中不能包含有\或/字符
  1. @echo off
  2. set "a=1" & set "b=50" & set "file=a.ini"
  3. (for /f "delims=" %%a in ('findstr /n .* "%file%"') do (
  4.     for /f "delims=" %%b in ("\%%a") do (
  5.         set "str=%%~nb"
  6.         setlocal enabledelayedexpansion
  7.         if "!str:~,2!%%~xb" == "2:.%a%" (
  8.             echo,!str:~2!.%b%
  9.         ) else (
  10.             if "!str:~,2!%%~xb" == "2:.%b%" (
  11.                 echo,!str:~2!.%a%
  12.             ) else echo,!str:*:=!%%~xb
  13.         )
  14.         endlocal
  15.     )
  16. ))>$
  17. move $ "%file%"
  18. pause
复制代码
或者这样试试:
  1. @set @n=0; /* & echo off
  2. set "a=1" & set "b=50" & set "file=a.ini"
  3. cscript -nologo -e:jscript "%~0"<"%file%">$ "%a%" "%b%"
  4. move $ "%file%"
  5. pause & exit/b & rem */
  6. var a = WScript.Arguments(0); b = WScript.Arguments(1);
  7. var txt = WScript.StdIn.ReadAll();
  8. var re = new RegExp("^(.*\\r?\\n.*\\.)("+a+"|"+b+")(\\s)", "")
  9. txt = txt.replace(re,
  10.     function (s0,s1,s2,s3) {
  11.         if (s2 == a){return s1+b+s3} else return s1+a+s3
  12.     }
  13. )
  14. WScript.StdOut.Write(txt)
复制代码

作者: zhong365    时间: 2014-6-1 00:07

回复 9# apang


    真棒,我试了第一段就成功了!!完全达到目的




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