2013-06-05 50 views
1

我想用vbscript的Eval(或者我需要执行)从一个ini文件中的键名创建一些变量。 ini文件可以具有无限的未知键= val对。无论如何,我需要根据密钥名称创建一个变量。vbscript将字符串评估为循环中的变量?

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具有正确的值。

关于我缺少什么或者甚至有可能的想法?

+2

我认为你需要重新评估你的架构。有一个ini文件,可以设置任何变量,它想要的声音...不安全。 – Richard

+0

在我的例子中看起来不像它的实际工作方式。没有风险。 – Dss

+2

'eval'和风险是同义词。 –

回答

1

您评估了字面代码pair.key = pair.value
分配给pair.key

你想分配给价值pair.key –如果pair.keymyPath,要EVAL myPath = pair.value
你可以做到这一点的连接字符串:

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

但我不知道“myPath”将成为我的键名。我需要根据文件中的键名动态生成变量。我的ini文件可能有“myPath”..另一个人可能称之为“xPath”..最后,我将需要使用msgbox myPath,他将需要使用msbox xPath – Dss

+0

@Dss:正确。您需要将字符串连接到eval。 – SLaks

+0

@SLaks -1用于混合评估和执行[全局]。 –

3

你需要Execute(一个赋值语句),而不是Eval(审视你们一个布尔表达式):

>> 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是否具有相同的值 。如果他们这样做,结果是真的;如果它们不是,结果是 错误。执行语句总是使用第一种解释 ,而Eval方法总是使用第二种解释。

(这并不意味着你应该做这样的事情,也不在家里,也不是在工作中)

+0

好的谢谢澄清..我一直试图评估和执行,但不断搅拌,这是做什么。使用下面的信息和SLaks答案了解它 – Dss

0

如果你想从一个INI读取键/值对文件,你会更好,将它们存储在字典中。几年前我写了一篇function。基本上看起来像这样:

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