0

本质上,我想获取给定目录中所有 .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
4

2 回答 2

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)

PP:

文件集合是动态的:

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集合的快照,所以我们可以假设解压缩可以安全而不需要文件列表。

于 2013-02-01T19:21:49.100 回答
1

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

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

最后但并非最不重要的一点是,可以使用一个简单的原生 VBScript数组(针对每个文件的属性进行标注):由于您知道可能的元素数量 (colFiles.Count),您可以在循环之前定义数组的大小,分配循环中的项目,并在循环后 ReDim 保留它。

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

PS:

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

PP:

对于担心者:

  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 的论点/证据 ==>For Each文件集合的快照上的循环 - 至少添加。删除测试留作练习。

于 2013-02-01T19:30:37.897 回答