Windows 读取INI文件并批量将其设置为全局变量

Windows 读取INI文件并批量将其设置为全局变量,windows,batch-file,Windows,Batch File,我有一个批处理文件,它已经做了很多事情,并且一直在尝试扩展它以从ini文件中获取一些数据 例如,ini文件如下所示 [Settings1] Text=Text Text1=Text Text2=Text [Settings2] Text=Text Text1=Text Text2=Text 我已经想出了一个方法,以获得我需要的部分与以下批次 @echo off setlocal EnableDelayedExpansion set "file=settings.ini" set "sect

我有一个批处理文件,它已经做了很多事情,并且一直在尝试扩展它以从ini文件中获取一些数据

例如,ini文件如下所示

[Settings1]
Text=Text
Text1=Text
Text2=Text

[Settings2]
Text=Text
Text1=Text
Text2=Text
我已经想出了一个方法,以获得我需要的部分与以下批次

@echo off

setlocal EnableDelayedExpansion
set "file=settings.ini"
set "section=[Settings1]"

set flag=0
for /f "usebackq delims=" %%# in ("%file%") do (
    set line=%%#
    ::trim
    for /f "tokens=* delims= " %%a in ("!line!") do set "line=%%a"
    set f=!line:~0,1!
    if "!f!" neq ";" (
        if !flag! equ 1 (
            ::for /f "tokens=1* delims==" %%a in ("!line!") do (
            for /f "tokens=1* delims==" %%a in ("%%#") do (
                set "!section!.%%a=%%b"

            )
        )

        if "!f!" equ "[" (
            if "!line!" equ "%section%" (
                set flag=1
            ) else (
                set flag=0
            )
        )       
    )
)

set %section%
然后输出以下内容

Settings1.Text=Text
Settings1.Text1=Text
Settings1.Text2=Text

我希望能够做到但无法解决的是,接收每个输出并分配值,这样就可以将等号后的“文本”分配给它自己的变量,然后在我的脚本中调用该变量。请看下面的示例。我使用了您现有的代码,尽管它可以改进。您可以看到我是如何利用
for/l
循环来告诉您可以做些什么。您可以对其进行塑形以适合所需的结果。你也可以为不同的部分考虑相同的解决方案。

@echo off
setlocal enabledelayedexpansion
set "file=settings.ini"
set "section=[Settings1]"
set num=0
set flag=0
for /f "usebackq delims=" %%# in ("%file%") do (
    set line=%%#
    ::trim
    for /f "tokens=* delims= " %%a in ("!line!") do set "line=%%a"
    set f=!line:~0,1!
    if "!f!" neq ";" (
        if !flag! equ 1 (
            ::for /f "tokens=1* delims==" %%a in ("!line!") do (
            for /f "tokens=1* delims==" %%a in ("%%#") do (
                set "!section!.%%a=%%b"
                set /a num+=1

            )
        )

        if "!f!" equ "[" (
            if "!line!" equ "%section%" (
                set flag=1
            ) else (
                set flag=0
            )
        )       
    )
)

for /l %%a in (0,1,%num%) do (
  if %%a equ 0 (
     if defined [Settings1].Text echo(%[Settings1].Text%
   ) else (
     if defined [Settings1].Text%%a echo(![Settings1].Text%%a!
  )
)

不确定,你的问题是什么。您已经在单独的变量中设置了值:
echo%[Settings1].Text1%
而不是底部的
set section
,请尝试单独回显每个变量。i、 e
echo%[Settings1].Text%
echo%[Settings1].Text1%
echo%[Settings1].Text2%
这也正是我想要的效果-问题是Settings1是硬编码的,我正在使用名为section的变量进行设置。为什么要将section名称添加到已知section中解析的每一行?如果你不想要它,就不要添加它。当然,您只想能够使用,
%Text%
%Text1%
,以及
%Text2%
!短信
!文本1,和
!短信2,并获取最初为
%section%
定义的节下分配的值。删除,
!节
设置"!第节%%a=%%b
将是一个很好的开始。这确实有效,我能够做到。但是,我不想使用settings1作为硬编码atm,它是使用名为%section%的变量设置的,这是因为在live脚本中,它接受用户输入,并用Yes填充section。这就是为什么我说您可以使用simlar循环来完成每个部分。没有硬编码。