vbscript Eval a string to a Variable in a loop?

前端 未结 3 1804
梦如初夏
梦如初夏 2020-12-22 01:33

I am trying to use vbscript\'s Eval (or maybe I need Execute) to create some variables from the key names from an ini file. The ini file can have unlimited unknown key=val p

相关标签:
3条回答
  • 2020-12-22 01:42

    You eval'd the literal code pair.key = pair.value.
    That assigns to pair.key.

    You want to assign to the value of pair.key – if pair.key is myPath, you want to eval myPath = pair.value.
    You can do that by concatenating strings:

    Execute(pair.name + " = pair.value")
    
    0 讨论(0)
  • 2020-12-22 01:44

    You need to Execute (an assign statement), not to Eval(uate a boolean expression):

    >> n = "Name"
    >> v = "Value"
    >> WScript.Echo TypeName(Eval("n=v"))
    >>
    Boolean
    >> Execute "n=v"
    >> WScript.Echo n
    >>
    Value
    >>
    

    From the docs:

    In VBScript, x = y can be interpreted two ways. The first is as an assignment statement, where the value of y is assigned to x. The second interpretation is as an expression that tests if x and y have the same value. If they do, result is True; if they are not, result is False. The Execute statement always uses the first interpretation, whereas the Eval method always uses the second.

    (This does not mean you should do such things; neither at home, nor at work)

    0 讨论(0)
  • 2020-12-22 01:51

    If you want to read key/value pairs from an INI file you'd be better off storing them in a dictionary. I wrote a function for this some years ago. Basically looks like this:

    Function ParseIni(filename)
      Set ParseIni = Nothing
    
      Set config = CreateObject("Scripting.Dictionary")
      section = ""
    
      Set file = CreateObject("Scripting.FileSystemObject").OpenTextFile(filename)
      Do While Not file.AtEndOfStream
        line = Trim(Replace(file.ReadLine, vbTab, " "))
        If InStr(line, ";") > 0 Then line = Trim(Left(line, InStr(line, ";") - 1))
        If line <> "" Then
          If Left(line, 1) = "[" And Right(line, 1) = "]" Then
            ' line is a section name
            section = Trim(Mid(line, 2, Len(line) - 2))
            If section = "" Then _
              WScript.Echo "Parse Error: section name is empty string."
            If config.Exists(section) Then _
              WScript.Echo "Parse Error: duplicate section name '" & name & "'."
            config.Add section, CreateObject("Scripting.Dictionary")
          ElseIf InStr(line, "=") > 0 Then
            ' line is a parameter line
            If section = "" And Not config.Exists(section) Then _
              config.Add section, CreateObject("Scripting.Dictionary")
            param = Split(line, "=", 2)
            param(0) = Trim(param(0))
            param(1) = Trim(param(1))
            If param(0) = "" Then _
              WScript.Echo "Parse Error: invalid parameter name '" & param(0) & "'."
            If param(1) = "" Then param(1) = True
            config(section).Add param(0), param(1)
          Else
            ' line is neither parameter nor section name, thus invalid
            WScript.Echo "Parse Error: expected parameter definition in line '" _
              & line & "'."
          End If
        End If
      Loop
      file.Close
    
      Set ParseIni = config
    End Function
    
    0 讨论(0)
提交回复
热议问题