2013-02-01 132 views
0

本質上,我想獲取給定目錄中的所有.zip文件的名稱並解壓縮它們。現在,我正在努力將文件的名稱變成某種數組或列表。它正確地抓取文件,但我對VBScript一無所知,有人能指出我正確的方向嗎?將項目添加到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 

回答

1

有...

' 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) 

PPS:

是Files集合動態:

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集合,所以我們可以假定解壓可以在不需要文件列表的情況下去安全。

+1

考慮使用普通的Dim fileArray和/或預先聲明數組大小(ArrayList的.Capacity),因爲使用.Files集合時,您在進入循環之前知道數字元素。 –

+0

不錯的一點,同意(+1)。 –

1

由於您已經有一個集合中的文件(colFiles),第一個擁有項目集合的理由 - 依次處理它們 - 並不會讓您將它們放在第二個列表中。爲什麼不直接解壓每個文件而不是將其放入列表中?解壓縮文件A不需要有關/訪問文件夾中其他文件X的信息。因此,收集的第二個原因 - 在同一時間/處理一個物品時需要所有元素 - 也不適用。

如果你堅持第二個列表,所有都取決於你想要對它做什麼/項目。如果您只想要一個名稱列表,最簡單的方法是將名稱/路徑作爲關鍵字放在字典中。如果你想要名稱排序,一個System.Collections.ArrayList/SortedList會更方便。如果您想使用文件的更多屬性/屬性(大小,日期,訪問權限等) - a 斷開連接的ADODB記錄集將允許您將所有這些屬性存儲在(SQL)表中。

最後,但並非最不重要的,一個簡單的原生的VBScript 陣列(尺寸爲每個文件屬性)可用於:正如你所知道的元素(colFiles.Count)的可能數目,您可以定義的大小循環之前的數組,循環中的項目分配以及ReDim在循環之後保留它。

請隨你選,我會在本貼中添加示例代碼。

P.S:

由於@Panayot給你的陣列和的ArrayList示例代碼,這將是有意義的要求ADO記錄集。

PPS:

對於煩惱的:

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在Files集合的快照上循環 - 至少添加了這些內容。刪除測試留作練習。

+0

這可能是一個非常具體的案例,雖然打擾了我,但如果我們將檔案解壓縮到同一個文件夾而不將它們存儲在數組或列表中,我們是不是冒着解壓和他們的子檔案的風險呢?文件不是「快照」,而是動態收藏。 –

+0

@PanayotKarabakalov - 請參閱P.P.S. –

+0

我稍後可能會測試您的代碼,但我看到您獲得了新的Files集合實例,並以結論表明它不是動態的。現在我將編輯上面的答案,並附加一個非常簡單的代碼。 –

相關問題