返回列表 发帖

[文本处理] 批处理读取INI的问题

搜索了一下,好像是不同小节下相同键值的不能读取。比如我的ini是这样的:
[1]
pcname=PC-001
ip=192.168.1.101
zw=255.255.255.0
wg=192.168.1.1
dns1=8.8.8.8
dns2=4.4.4.4

[2]
pcname=PC-002
ip=192.168.1.102
zw=255.255.255.0
wg=192.168.1.1
dns1=8.8.8.8
dns2=4.4.4.4

[3]
pcname=PC-003
ip=192.168.1.103
zw=255.255.255.0
wg=192.168.1.1
dns1=8.8.8.8
dns2=4.4.4.4


我要读取3小节下面的pcname键值,是要怎么写?

@echo off
setlocal enabledelayedexpansion
set f3=0
for /f "dellims=" %%a in (1.ini) do (
    set f0=%%a
    set f2=!f0:~0,2!
    if !f3!==1 (set %%a)
    if "!f2!"=="[3" (
        set f3=1
    ) else (
        set f1=!f0:~0,1!
        if "!f1!"=="[" (set f3=0)
    )
)
echo;%pcname%
pause
exitCOPY

TOP

回复 2# 路过

感谢回复!

实际运行中有点儿问题,比如我ini里面有300个小节的话,两位数的小节不能识别,而且1小节和11小节和111小节会不会有错误?

TOP

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.ini) do (
    if "%%a"=="[3]" (
        set n=true
    ) else if !n!==true (
        set str=%%a
        echo !str:~-6!
        goto :o
    )
)
:o
pause
exitCOPY

TOP

回复 4# qixiaobin0715


感谢回复,实际运行中,能正常读取到pcname,但是怎么读ip和zw之类的?

TOP

请一次把话说完:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims==" %%a in (1.ini) do (
    if "%%a"=="[3]" (
        set n=true
    ) else if !n!==true (
        if "%%a"=="[4]" goto :o
        echo,%%b
    )
)
:o
pause
exitCOPY

TOP

保存为 xxx.ps1 右键运行
$file="$(gl)\a.txt"; #加载文件
$id=1;  #[数字]
$r='0.0.0.0'; #替换内容
$name='ip';  #替换标识
[regex]::Replace([IO.File]::ReadAllText($file,[Text.Encoding]::Default),
"(?ism)(?<=\[$id].*?$name=)(?:[^`r`n]+)",$r)|sc '.\new.log';
&cmd /c pause;COPY
QQ: 458609586
脚本优先 [PowerShell win10]

TOP

返回列表