基本上,我想获取给定目录中所有.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
答案 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。删除测试留待练习。