在VBScript中将项添加到列表的最佳方法?

时间:2013-02-01 18:45:38

标签: vbscript

基本上,我想获取给定目录中所有.zip文件的名称并解压缩它们。现在,我正在努力将文件的名称变成某种数组或列表。它正确地抓取了文件,但我对VBScript一无所知,有人能指出我正确的方向吗?

Dim fileList

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objStartFolder = "C:\Test"

    Set objFolder = objFSO.GetFolder(objStartFolder)
    Wscript.Echo objFolder.Path

    Set colFiles = objFolder.Files

    For Each objFile in colFiles
        If UCase(objFSO.GetExtensionName(objFile.name)) = "ZIP" Then
            Wscript.Echo objFile.Name
            'Add file names to fileList variable
        End If
    Next

2 个答案:

答案 0 :(得分:2)

有......

' using vbArray
ReDim fileArray(-1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "C:\Test"

Set objFolder = objFSO.GetFolder(objStartFolder)

For Each objFile In objFolder.Files
    If UCase(objFSO.GetExtensionName(objFile.Name)) = "ZIP" Then
        ReDim Preserve fileArray(UBound(fileArray) + 1)
        fileArray(UBound(fileArray)) = objFile.Name
    End If
Next

WScript.Echo Join(fileArray, vbNewLine)

' using .NET ArrayList (as no biult-in Lists in VBScript)
Dim fileList
Set fileList = CreateObject("System.Collections.ArrayList")

For Each objFile In objFolder.Files
    If UCase(objFSO.GetExtensionName(objFile.Name)) = "ZIP" Then
        fileList.Add objFile.Name
    End If
Next

WScript.Echo Join(fileList.ToArray, vbNewLine)

<强> P.P.S:

文件集合是否动态:

Set oFSO = CreateObject("Scripting.FileSystemObject")
curDir = CreateObject("WScript.Shell").CurrentDirectory

Set oFolder = oFSO.GetFolder(curDir)
Set oFiles = oFolder.Files

WScript.Echo "Files count: " & oFiles.Count

Set oFile = oFSO.CreateTextFile(oFSO.GetTempName)
oFile.Close

WScript.Echo "Files count: " & oFiles.Count

[编辑]但是看起来像是迭代VBS使用Files集合的快照,所以我们可以假设unzip可以安全而不需要文件列表。

答案 1 :(得分:1)

由于你已经拥有了一个集合中的文件(colFiles),拥有一组项目的第一个理由 - 依次处理它们 - 并不会让你把它们放在第二个列表中。为什么不解压缩每个文件而不是将其放入列表中?要解压缩文件A,您不需要有关/访问文件夹中其他文件X的信息。所以收集的第二个原因 - 同时需要所有元素/处理一个项目 - 也不适用。

如果你坚持第二个清单,一切都取决于你想用它/项目做什么。如果您只想要一个名称列表,最简单的方法是将名称/ pathes作为键放在 Dictionary 中。如果您希望对名称进行排序,则 System.Collections.ArrayList / SortedList 将更加方便。如果您想使用文件的更多属性/属性 - 大小,日期,访问权限...... - 断开连接的ADODB记录集将允许您将所有这些属性存储在(SQL)表中

最后但并非最不重要的是,可以使用简单的本机VBScript 数组(针对每个文件的属性标注尺寸):如您所知,可能的元素数量(colFiles.Count),您可以在循环之前定义数组的大小,在循环中分配项,在循环之后重新保存它。

选择,我会在此帖子中添加示例代码。

P.S:

由于@Panayot为您提供了Arrays和ArrayLists的示例代码,因此请求ADO Recordset是有意义的。

<强> P.P.S:

对于担忧者:

  Dim oFS : Set oFS  = CreateObject( "Scripting.FileSystemObject" )
  Dim sDir : sDir      = "..\testdata\testFilesCollection"

  Dim nFile, sFile, oFile, i

  If oFS.FolderExists( sDir ) Then oFS.DeleteFolder sDir
  oFS.CreateFolder sDir

  WScript.Echo "----- Creating", cnMax, "files"
  For nFile = 1 To cnMax
      sFile = nFile & ".txt"
      oFS.CreateTextFile oFS.BuildPath( sDir, sFile )
      WScript.Echo sFile, "created"
  Next
  WScript.Echo "----- Looping over", cnMax, "files and creating", cnMax, "more"
  i = 0
  For Each oFile In oFS.GetFolder( sDir ).Files
      If i <= cnMax Then
         sFile = Chr(65 + i) & ".txt"
         oFS.CreateTextFile oFS.BuildPath( sDir, sFile )
      End If
      i = i + 1
      WScript.Echo oFile.Name, "seen", sFile, "created"
  Next
  WScript.Echo "----- Looping over", 2 * cnMax, "files"
  For Each oFile In oFS.GetFolder( sDir ).Files
      WScript.Echo oFile.Name, "seen"
  Next

输出:

----- Creating 3 files
1.txt created
2.txt created
3.txt created
----- Looping over 3 files and creating 3 more
2.txt seen A.txt created
3.txt seen B.txt created
1.txt seen C.txt created
----- Looping over 6 files
B.txt seen
2.txt seen
C.txt seen
A.txt seen
3.txt seen
1.txt seen

[文件集合是快照] == @ Panayot的论点/证据==&gt; For Each循环遍历Files集合的快照 - 至少添加了wrt。删除测试留待练习。