【问题标题】:Array loses values after loop in Vbscript数组在 Vbscript 中循环后丢失值
【发布时间】:2013-08-04 13:27:08
【问题描述】:

这是代码:

'creates the msxml object
Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0")
Dim retVal

'load the xml data of the script
retVal=xmlDoc.load(argFilePath)

Dim fso, folder, sFolder
Dim xmlDataPath, curNode

'get input folder
Set curNode=xmlDoc.selectSingleNode("//ScriptXmlData/inputFilePath")
Dim inputFolder, outputFolder, hotLoc
inputFolder=CSTR(curNode.text)

'location of jdf files
sFolder=inputFolder

'creating file getting object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(sFolder)

Dim amount, fName, arrC, i
i=0

'loop for getting amounts
For each folderIdx In folder.files
    If fso.GetExtensionName(folderIdx.Name) = "jdf" Then

        'increase array size
        Redim arrC(i)

        'get folder name
        fName=folderIdx.Name

        'get file path
        xmlDataPath = sFolder+"\"+fName

        'load the xml data of the script
        retVal = jdfDoc.load(xmlDataPath)

        'get amount
        Set curNode = jdfDoc.selectSingleNode("//jdf:JDF/jdf:ResourceLinkPool/jdf:ComponentLink")
        amount = curNode.getAttribute("Amount")

        'Create array that holds amount
        arrC(i)=amount
        i=i+1

    End If
Next

wscript.echo arrC(0)
wscript.echo arrC(1)
wscript.echo arrC(2)

我们的问题是一旦 arrC 退出循环,它的一些值就会丢失。 例如,在循环中我们的数组是:

arrC(0)=100
arrC(1)=150
arrC(2)=200

一旦它离开循环,就像在代码末尾的测试中一样,它的值是:

arrC(0)=""
arrC(1)=""
arrC(2)=200

谁能解释一下?

谢谢!

【问题讨论】:

    标签: arrays loops vbscript


    【解决方案1】:

    ReDim 不使用关键字Preserve 时不保留数组的元素。换行

    Redim arrC(i)
    

    进入

    Redim Preserve arrC(i)
    

    您不需要索引变量,顺便说一句。当您将arrC 初始化为循环外的空数组时,您可以使用上限作为索引:

    ReDim arrC(-1)
    
    For Each folderIdx In folder.files
      If fso.GetExtensionName(folderIdx.Name) = "jdf" Then
        ...
        ReDim Preserve arrC(UBound(arrC)+1)
        arrC(UBound(arrC)) = amount
      End If
    Next
    

    但是,由于ReDim Preserve 实际上创建了一个 数组并从旧数组中复制现有元素,因此随着数组大小的增加,它的性能肯定会很差。您可能想改用array list

    Set arrC = CreateObject("System.Collections.ArrayList")
    
    For Each folderIdx In folder.files
      If fso.GetExtensionName(folderIdx.Name) = "jdf" Then
        ...
        arrC.Add amount
      End If
    Next
    

    【讨论】:

    • 非常彻底!!非常感谢你很棒!你能想出一个变量会发生这种情况的方法吗?以前发生在我们身上,但我们能够避免它......
    • 什么样的变量在什么上下文中?
    • 我们创建了自己的“替换”函数,该函数处于循环中。我们将结果字符串放在一个变量中。循环运行了 3 次,每次都替换了其他东西,然后在循环之外,变量将失去它的值
    • 可能是变量范围的问题。没有看到实际代码很难说。
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多