【问题标题】:INI file get section line by lineINI 文件逐行获取节
【发布时间】:2016-06-10 18:36:43
【问题描述】:

我有一个像这样的ini 文件:

[第 1 节]
第1行
线2
[第2节]
第 3 行
第4行

我想读取行,但只能从 [section1] 读取。 我只需要 line1line2 作为字符串。 现在它正在运行:

SET var=lines.txt
FOR /F "tokens=*" %%a in (%var%) DO (
    CALL script.cmd %%a
)

这是一个批处理文件,但我找不到解决方案。 每次我想使用来自section2的内容时,我都需要使用lines2.txt,但现在我合并在一起(上面的ini文件)。

【问题讨论】:

    标签: powershell batch-file cmd


    【解决方案1】:

    使用标志来切换动作(找到起始标头时设置标志,当下一个标头开始时取消设置):

    @echo off
    set var=test.ini
    set "flag="
    FOR /F "tokens=*" %%a in (%var%) DO (
      if defined flag (
         echo %%a|find "[" >null && set "flag=" || (
           echo calling script.cmd with parameter %%a
         )
      ) else (
        if "%%a" == "[section1]" set flag=1
      )
    )
    

    【讨论】:

      【解决方案2】:

      在 PowerShell 中,您可以使用这两个读取 section1 的前两行:

      $content = Get-Content "Your_Path_here"
      $section1Start = $content | Where-Object { $_ -match '\[section1\]'} | select -ExpandProperty ReadCount
      $content | Select -Skip $section1Start -First 2
      

      【讨论】:

      • 如果你不知道这个部分有多少键怎么办?
      • 那你要确定新section的位置(同section1start),减去section1start和section1end,传给-first参数。
      【解决方案3】:

      我建议正确解析 INI 文件,例如像这样:

      $inifile = 'C:\path\to\your.ini'
      $ini = @{}
      
      Get-Content $inifile | ForEach-Object {
        $_.Trim()
      } | Where-Object {
        $_ -notmatch '^(;|$)'
      } | ForEach-Object {
        if ($_ -match '^\[.*\]$') {
          $section = $_ -replace '\[|\]'
          $ini[$section] = @{}
        } else {
          $key, $value = $_ -split '\s*=\s*', 2
          $ini[$section][$key] = $value
        }
      }
      

      然后你可以像这样访问section1的元素:

      $ini['section1']['line1']
      

      或(使用点符号)像这样:

      $ini.section1.line1
      

      您还可以像这样枚举一个部分的所有元素:

      $ini['section1'].Keys
      $ini['section1'].Values
      

      或者像这样:

      $ini['section1'].GetEnumerator()
      

      【讨论】:

        【解决方案4】:

        如果您的 ini 文件具有有效格式,这会将所需部分中的所有行设置在以 [section1] 开头的变量列表中。它还将处理 cmets 并将在行上执行左修剪。仅使用 cmd 内部命令,因此应该很快。

        @echo off
        
        setlocal EnableDelayedExpansion
        set "file=test.ini"
        set "section=[section1]"
        
        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%.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-17
          • 2011-12-26
          • 2013-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-09
          相关资源
          最近更新 更多