在VBScript中,我如何管理;Scripting.FileSystemObjects“;像多文件夹/文件的objFSO和objFolder?

在VBScript中,我如何管理;Scripting.FileSystemObjects“;像多文件夹/文件的objFSO和objFolder?,scripting,vbscript,multiple-instances,filesystemobject,Scripting,Vbscript,Multiple Instances,Filesystemobject,在VBScript中,如何管理多个文件夹/文件的“Scripting.FileSystemObjects”,如objFSO和objFolder 在“Main”代码部分,我声明了“Scripting.FileSystemObject”的一个实例(全局) 然后,我执行一些操作,如: If objFSO.FileExists(strOutputFilename) Then WScript.Echo "Deleting File: " & strOutputFilenam

在VBScript中,如何管理多个文件夹/文件的“Scripting.FileSystemObjects”,如objFSO和objFolder

在“Main”代码部分,我声明了“Scripting.FileSystemObject”的一个实例(全局)

然后,我执行一些操作,如:

    If objFSO.FileExists(strOutputFilename) Then
        WScript.Echo "Deleting File: " & strOutputFilename
        objFSO.DeleteFile strOutputFilename
    End If
然后,在循环中,我获取一个文件夹,并将其传递给函数:

    For gintLoop = 0 to (ubound(arraySearchPath))
        wscript.echo "Processing folder:" & arraySearchPath(gintLoop)
        Set objFolderX = objFSO.GetFolder(arraySearchPath(gintLoop))
        Call DoWork (objFolderX, arrayParam1, arrayParam2)
    Next
到目前为止一切都很清楚

现在,在函数中,我执行如下操作:
a) 从objFolder收集文件名

    Set lobjFolder = objFSO.GetFolder(objFolderX.Path)  
    Set lcolFiles = lobjFolder.Files
b) 检查其他(不相关)路径中是否存在文件

c) 获取各种文件的大小:

    lcurInputFileSize = CCur(lobjFile.Size)
d) 删除各种文件

e) 打开文件进行读取

    For Each lobjFile in lcolFiles
        lstrTargetFile = lobjFolder.Path & "\" & lobjFile.Name
        Set lobjInputFile = objFSO.OpenTextFile(lstrTargetFile, ForReading)
    ...
f) 打开文件进行写入

    Set lobjOutputFile = objFSO.OpenTextFile(strOutputFilename, ForAppending, True)
g) 调用传递各种对象的其他子对象/函数

h) 递归调用(相同)函数来处理其他文件夹

    For Each lobjSubfolderY in objFolderX.SubFolders
        Call DoWork (lobjSubfolderY, arrayParam1, arrayParam2)
    Next
我担心的是,我需要确保文件系统对象的各种用途,如文件夹路径、打开的文件等,不会被以后使用的文件系统对象“踩到”

问题1: 我是否需要(或建议)为“Main”和每个(或某些)子/函数提供一个单独的“Scripting.FileSystemObject”(objFSO)实例

问题2: 类似地,如何管理各种其他对象以避免丢失数据


Kevin

Q1:不,您不需要多个Scripting.FileSystemObject实例

对象上的方法都是静态的

事实上,脚本运行时参考文档表明FSO是单例的,尽管它没有使用以下单词:

您只能创建FileSystemObject对象的一个实例,而不管您尝试创建另一个实例的次数如何

发件人:

根据我的经验,多次调用
WScript.CreateObject(“Scripting.FileSystemObject”)
不会导致错误。后续调用的返回值可能只是最初创建的FSO的副本

至于你的问题2,我不明白。我认为您指的是FSO返回的对象,类型为Folder、File、TextStream等的对象


将它们视为任何其他有状态对象。您可以有多个实例,如果要执行递归,则需要将它们作为基于堆栈的参数传递。

Q1:不,您不需要脚本的多个实例。FileSystemObject

对象上的方法都是静态的

事实上,脚本运行时参考文档表明FSO是单例的,尽管它没有使用以下单词:

您只能创建FileSystemObject对象的一个实例,而不管您尝试创建另一个实例的次数如何

发件人:

根据我的经验,多次调用
WScript.CreateObject(“Scripting.FileSystemObject”)
不会导致错误。后续调用的返回值可能只是最初创建的FSO的副本

至于你的问题2,我不明白。我认为您指的是FSO返回的对象,类型为Folder、File、TextStream等的对象


将它们视为任何其他有状态对象。您可以有多个实例,如果要执行递归,则需要将它们作为基于堆栈的参数传递。

Q1:谢谢。。。我看到了关于创建多个objFSO的冲突信息。这是第一次有人引用解释和确认它的文件。问题2:是的,我说的是文件夹、文件等。。。至于“基于堆栈的参数”,您是指作为参数传递给子/函数调用的项吗。。。我想这些应该是“ByRef”而不是“ByVal”。是的,这就是我的意思。对象将通过ref传递,但这不是您需要担心的。只要专注于为您正在处理的每个文件或文件夹维护一个不同的对象实例。在您的帮助下,我能够解决问题,再次感谢。我还在递归函数中发现了一个objFile,它总是为同一个文件(logfile)进行“设置”。所以,我在“Main”程序中将它改为Dim(med),所以它现在是一个全局对象。Q1:谢谢。。。我看到了关于创建多个objFSO的冲突信息。这是第一次有人引用解释和确认它的文件。问题2:是的,我说的是文件夹、文件等。。。至于“基于堆栈的参数”,您是指作为参数传递给子/函数调用的项吗。。。我想这些应该是“ByRef”而不是“ByVal”。是的,这就是我的意思。对象将通过ref传递,但这不是您需要担心的。只要专注于为您正在处理的每个文件或文件夹维护一个不同的对象实例。在您的帮助下,我能够解决问题,再次感谢。我还在递归函数中发现了一个objFile,它总是为同一个文件(logfile)进行“设置”。所以,我在“Main”程序中将它改为Dim(med),所以它现在是一个全局对象。
    For Each lobjSubfolderY in objFolderX.SubFolders
        Call DoWork (lobjSubfolderY, arrayParam1, arrayParam2)
    Next