【问题标题】:Read data from ini file从ini文件中读取数据
【发布时间】:2014-03-16 12:28:07
【问题描述】:

我有一个接受输入文件名的 vbscript

代码是

 Dim tsout: Set tsout = gofs.CreateTextFile("C:\....csv")
 Dim tsin: Set tsin = gofs.OpenTextFile("C:\.....csv")

我如何配置它以便从配置文件中读取路径createTextFile(....)(.ini)

创建和写入输出的文件路径,必须取自ini文件

这是我的ini文件

// 我的ini文件

[Read_file]
tsout=E:.....tt.csv
tsin=E:\....gt.csv

    [col]
Number1=4
Number2=5

【问题讨论】:

    标签: vbscript ini


    【解决方案1】:

    Ekkehard 的演示针对 Classic ASP 进行了调整:

    Function demoReadIniFile()
      demoReadIniFile = 0
      Dim dicIni : Set dicIni = ReadIniFile("c:\path\to\21825192.ini")
      Dim sSec, sKV
      For Each sSec In dicIni.Keys()
          response.write "---" & sSec & "<br>"
          For Each sKV In dicIni(sSec).Keys()
              response.write " " & sKV & " => " & dicIni(sSec)(sKV) & "<br>"
          Next
      Next
    '  response.write dicIni("tsout")("Path") & "<br>"
    End Function
    

    他的 ReadIniFile() 像写的那样工作。

    【讨论】:

      【解决方案2】:

      .ini 文件解析器的简单版本:

      Option Explicit
      
      Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")
      
      'WScript.Quit demoReadFile()
      WScript.Quit demoReadIniFile()
      
      Function demoReadFile()
        demoReadFile = 0
        Dim tsIn : Set tsIn = goFS.OpenTextFile(".\21825192.ini")
        Do Until tsIn.AtEndOfStream
           Dim sLine : sLine = tsIn.ReadLine()
           WScript.Echo tsIn.Line - 1, sLine
        Loop
        tsIn.Close
      End Function
      
      Function demoReadIniFile()
        demoReadIniFile = 0
        Dim dicIni : Set dicIni = ReadIniFile(".\21825192.ini")
        Dim sSec, sKV
        For Each sSec In dicIni.Keys()
            WScript.Echo "---", sSec
            For Each sKV In dicIni(sSec).Keys()
                WScript.Echo " ", sKV, "=>", dicIni(sSec)(sKV)
            Next
        Next
        WScript.Echo dicIni("tsout")("Path")
      End Function
      
      Function ReadIniFile(sFSpec)
        Dim dicTmp : Set dicTmp = CreateObject("Scripting.Dictionary")
        Dim tsIn   : Set tsIn   = goFS.OpenTextFile(sFSpec)
        Dim sLine, sSec, aKV
        Do Until tsIn.AtEndOfStream
           sLine = Trim(tsIn.ReadLine())
           If "[" = Left(sLine, 1) Then
              sSec = Mid(sLine, 2, Len(sLine) - 2)
              Set dicTmp(sSEc) = CreateObject("Scripting.Dictionary")
           Else
              If "" <> sLine Then
                 aKV = Split(sLine, "=")
                 If 1 = UBound(aKV) Then
                    dicTmp(sSec)(Trim(aKV(0))) = Trim(aKV(1))
                 End If
              End If
           End If
        Loop
        tsIn.Close
        Set ReadIniFile = dicTmp
      End Function
      

      输出:

      cscript 21825192.vbs
      1 [pipapo]
      2 Path=E:\dont\find\me.csv
      3   Some  = thing else
      4
      5 [tsout]
      6 Path=E:\where\ever\output.csv
      7 abc=def
      
      cscript 21825192.vbs
      --- pipapo
        Path => E:\dont\find\me.csv
        Some => thing else
      --- tsout
        Path => E:\where\ever\output.csv
        abc => def
      E:\where\ever\output.csv
      

      (背景见this answer

      更新评论/编辑:

      我将您的部分添加到我的示例 .ini 文件中:

      type 21825192.ini
      [pipapo]
      Path=E:\dont\find\me.csv
        Some  = thing else
      
      [tsout]
      Path=E:\where\ever\output.csv
      abc=def
      
      [Read_file]
      tsout=E:.....tt.csv
      tsin=E:\....gt.csv
      
          [col]
      Number1=4
      Number2=5
      

      并且 - 为了清楚起见 - 将我的 demoReadIniFile() 函数的最终输出行更改为:

        WScript.Echo "tsout.Path", dicIni("tsout")("Path")
        WScript.Echo "Read_file.tsin", dicIni("Read_file")("tsin")
        WScript.Echo "col.Number2", dicIni("col")("Number2")
      

      输出:

      cscript 21825192.vbs
      --- pipapo
        Path => E:\dont\find\me.csv
        Some => thing else
      --- tsout
        Path => E:\where\ever\output.csv
        abc => def
      --- Read_file
        tsout => E:.....tt.csv
        tsin => E:\....gt.csv
      --- col
        Number1 => 4
        Number2 => 5
      tsout.Path E:\where\ever\output.csv
      Read_file.tsin E:\....gt.csv
      col.Number2 5
      

      所以我完全不明白为什么访问“取出 number1=4 和 Number2=5 的 col 部分”会导致任何问题。

      【讨论】:

      • 这对我来说非常有用!值得注意的一件事(可能会让人有些头疼):如果您在 .ini 文件中使用制表符而不是空格,则会出现问题。在键名和等号之间使用空格或不使用空格。
      • 注意:上面的 ReadIniFile() 函数与 PHP 读取它们的方式并不完全相关。上面的内容将超出分号,PHP 将其读取为要忽略的注释的开头。如果用引号括起来,PHP 将采用包括分号在内的整个字符串;但 ASP 将自己读取引号作为值的一部分..
      • 搜索ini文件解析器发现很多解析器存在多个问题:无法保留cmets,无法保留初始格式,每次访问单个键/值时都会重新读取/重新解析整个文件等。此解析器至少有 2 个问题,这意味着您不能将其用于外部应用程序配置文件。
      【解决方案3】:

      VBS 不支持 IniFile 类。您需要创建自己的 INI 文件解析器。其他解决方案(也可以创建自己的解析函数,但比解析INI文件容易得多):保存TAB分隔的数据,例如:第一个传出的文件,然后是TAB char,而不是传入的文件。

      【讨论】:

        猜你喜欢
        • 2012-06-29
        • 2014-02-20
        • 2015-10-01
        • 2013-09-15
        • 2022-01-21
        • 2016-02-23
        • 2015-11-17
        • 2013-04-18
        • 2015-10-02
        相关资源
        最近更新 更多