String vbscript将字符串求值为循环中的变量?

String vbscript将字符串求值为循环中的变量?,string,variables,vbscript,eval,execute,String,Variables,Vbscript,Eval,Execute,我正在尝试使用vbscript的Eval,或者可能需要Execute从ini文件的键名创建一些变量。ini文件可以有无限的未知key=val对。我需要创建一个基于键名的变量,不管是什么 Ini文件内容: myPath=c:\test myExe=myapp.exe .... xxx=123 yyy=abc 读取ini并将键和值返回给对象的代码 我尝试使用的代码如下: For each pair in objINI Eval("pair.key=pair.val") Next msgb

我正在尝试使用vbscript的Eval,或者可能需要Execute从ini文件的键名创建一些变量。ini文件可以有无限的未知key=val对。我需要创建一个基于键名的变量,不管是什么

Ini文件内容:

myPath=c:\test
myExe=myapp.exe
....
xxx=123
yyy=abc
读取ini并将键和值返回给对象的代码

我尝试使用的代码如下:

For each pair in objINI
    Eval("pair.key=pair.val")
Next

msgbox myPath
msgbox myExe
但两个msgbox都显示为空 是的,我确信pair.key和pair.val的值是正确的


思考我遗漏了什么或者这是否可能?

您需要评估文字代码pair.key=pair.value。 分配给pair.key的

您希望为pair.key的值赋值–如果pair.key是myPath,则需要求值myPath=pair.value。 可以通过连接字符串来实现这一点:

Execute(pair.name + " = pair.value")

您需要计算文字代码pair.key=pair.value。 分配给pair.key的

您希望为pair.key的值赋值–如果pair.key是myPath,则需要求值myPath=pair.value。 可以通过连接字符串来实现这一点:

Execute(pair.name + " = pair.value")
您需要执行assign语句,而不是计算布尔表达式:

>> n = "Name"
>> v = "Value"
>> WScript.Echo TypeName(Eval("n=v"))
>>
Boolean
>> Execute "n=v"
>> WScript.Echo n
>>
Value
>>
从文档中:

在VBScript中,x=y可以用两种方式解释。第一个是作为一个 赋值语句,其中y的值被赋值给x。这个 第二种解释是作为一个表达式来测试x和y是否 相同的值。如果他们这样做,结果是真实的;如果不是,结果是 错误的Execute语句始终使用第一个解释, 而Eval方法总是使用第二种方法

这并不意味着你应该做这样的事情;无论是在家中还是在工作中

您都需要执行assign语句,而不是计算布尔表达式:

>> n = "Name"
>> v = "Value"
>> WScript.Echo TypeName(Eval("n=v"))
>>
Boolean
>> Execute "n=v"
>> WScript.Echo n
>>
Value
>>
从文档中:

在VBScript中,x=y可以用两种方式解释。第一个是作为一个 赋值语句,其中y的值被赋值给x。这个 第二种解释是作为一个表达式来测试x和y是否 相同的值。如果他们这样做,结果是真实的;如果不是,结果是 错误的Execute语句始终使用第一个解释, 而Eval方法总是使用第二种方法


这并不意味着你应该做这样的事情;无论是在家还是在工作中

如果您想从INI文件中读取键/值对,最好将它们存储在字典中。几年前我为此写了一篇文章。基本上是这样的:

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

如果要从INI文件中读取键/值对,最好将它们存储在字典中。几年前我为此写了一篇文章。基本上是这样的:

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

但我不知道我的路径会是我的键名。我需要根据文件中的密钥名动态生成变量。我的ini文件可能有myPath。。另一个人可能会称之为xPath。。最后,我需要使用msgbox myPath,他也需要使用msboxxPath@Dss:没错。您需要将字符串连接到eval。@SLaks-1用于混合eval和Execute[Global]。我不太明白您的意思SLaks。。连接字符串在这里似乎不相关。我只是想把一个字符串转换成一个变量。key是要创建的变量的全名。我想我需要一个类似双重求值的东西,它将首先求值pair.key到一个字符串,然后求值将其设置为pair.valueYES的变量!谢谢我明白你现在说的concat是什么意思了。工作得很好。但我不知道我的路径会是我的键名。我需要根据文件中的密钥名动态生成变量。我的ini文件可能有myPath。。另一个人可能会称之为xPath。。最后,我需要使用msgbox myPath,他也需要使用msboxxPath@Dss:没错。您需要将字符串连接到eval。@SLaks-1用于混合eval和Execute[Global]。我不太明白您的意思SLaks。。连接字符串在这里似乎不相关。我只是想把一个字符串转换成一个变量。key是要创建的变量的全名。我想我需要一个类似双重求值的东西,它将首先求值pair.key到一个字符串,然后求值将其设置为pair.valueYES的变量!谢谢我明白你现在说的concat是什么意思了。工作完美。我认为你需要重新评估你的架构。拥有一个ini文件,可以设置它想要的任何变量,这听起来是不安全的。在我的例子中,它的外观并不是它实际工作的方式。没有风险。评估和风险是同义词。我认为您需要重新评估您的体系结构。拥有一个ini文件,可以设置它想要的任何变量,这听起来是不安全的。在我的例子中,它的外观并不是它实际工作的方式。没有风险。评估和风险是同义词。啊,好的,谢谢你的澄清。。我一直在尝试评估和执行,但一直混淆了哪些是在做什么。用这些信息和下面的答案让它工作了好的谢谢你的澄清。。我一直在尝试评估和执行,但一直混淆了哪些是在做什么。用这个来工作 fo和SLaks的答案如下