VBScript - 在循环期间使用文件夹名称创建文本文件

时间:2014-09-10 19:44:37

标签: vbscript

问题: 下面的脚本循环遍历4,000多万个文件并检索文件属性信息以确定可以清除的内容。目前的流程已经使用了20 + GB的RAM,只完成了一半。

我一直在创建一个大型批处理文件,将每个子文件夹内容写入新的文本文件。这不实用,因为它耗时,而且这是我将在此过程中运行的几台服务器中的第一台。

问题: - 是否可以根据子文件夹循环创建要写入的新文件? (使用object属性代替文件似乎没有诀窍) - 或者可以将内容写入文件,然后从我的临时内存中清除以前的数据吗?

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

Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files

For Each objFile in colFiles
    On Error Resume Next 
    If Err Then
        MyFile.Write "Error accessing " & objFile & ": " & Err.Description & vbCrLf
        Err.Clear
    Else
        Q="""" 'Wrap quotes around string
        strFilePath = Q & objFile.Path & Q
        strFileName = Q & objFile.Name & Q
        strFileSize = objFile.Size
        strFileType = Q & objFile.Type & Q
        strFileDateCreated = objFile.DateCreated
        strFileDateLastAccessed = objFile.DateLastAccessed
        strFileDateLastModified = objFile.DateLastModified
        Set objWMIService = GetObject("winmgmts:")
        Set objFileSecuritySettings = _
        objWMIService.Get("Win32_LogicalFileSecuritySetting=""" & replace(objFile,     "\", "\\") & """")
        intRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD)
        If intRetVal = 0 Then
            strFileOwner = Q & objSD.Owner.Domain & "\" & objSD.Owner.Name & Q
        Else
            strFileOwner = Q & "Couldn't retrieve security descriptor." & Q
        End If

'               CreatedDiff = DateDiff("yyyy",strFileDateCreated,Now)
'               AccessedDiff = DateDiff("yyyy",strFileDateLastAccessed,Now)
'               ModifiedDiff = DateDiff("yyyy",strFileDateLastModified,Now)
'               MaxTime = 3 'Max time in years. For days change "yyyy" to "d"

'               If (CreatedDiff >= MaxTime) AND (AccessedDiff >= MaxTime) AND     (ModifiedDiff >= MaxTime) Then

            MyFile.Write strFilePath & "~|~" &_
            strFileName & "~|~" &_
            strFileSize & "~|~" &_
            strFileType & "~|~" &_
            strFileDateCreated & "~|~" &_
            strFileDateLastAccessed & "~|~" &_
            strFileDateLastModified & "~|~" &_
            strFileOwner & vbCrLf
'           End If
    End If
Next

ShowSubfolders objFSO.GetFolder(objStartFolder)

Sub ShowSubFolders(Folder)
    For Each Subfolder in Folder.SubFolders
    On Error Resume Next
        Set objFolder = objFSO.GetFolder(Subfolder.Path)
        Set colFiles = objFolder.Files

    For Each objFile in colFiles
    On Error Resume Next 
    If Err Then
        MyFile.Write "Error accessing " & objFile & ": " & Err.Description & vbCrLf
        Err.Clear
    Else
        Q="""" 'Wrap quotes around string
        strFilePath = Q & objFile.Path & Q
        strFileName = Q & objFile.Name & Q
        strFileSize = objFile.Size
        strFileType = Q & objFile.Type & Q
        strFileDateCreated = objFile.DateCreated
        strFileDateLastAccessed = objFile.DateLastAccessed
        strFileDateLastModified = objFile.DateLastModified
        Set objWMIService = GetObject("winmgmts:")
        Set objFileSecuritySettings = _
        objWMIService.Get("Win32_LogicalFileSecuritySetting=""" & replace(objFile, "\", "\\") & """")
        intRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD)
        If intRetVal = 0 Then
            strFileOwner = Q & objSD.Owner.Domain & "\" & objSD.Owner.Name & Q
        Else
            strFileOwner = Q & "Couldn't retrieve security descriptor." & Q
        End If

'               CreatedDiff = DateDiff("yyyy",strFileDateCreated,Now)
'               AccessedDiff = DateDiff("yyyy",strFileDateLastAccessed,Now)
'               ModifiedDiff = DateDiff("yyyy",strFileDateLastModified,Now)
'               MaxTime = 3 'Max time in years. For days change "yyyy" to "d"

'               If (CreatedDiff >= MaxTime) AND (AccessedDiff >= MaxTime) AND (ModifiedDiff >= MaxTime) Then

            MyFile.Write strFilePath & "~|~" &_
            strFileName & "~|~" &_
            strFileSize & "~|~" &_
            strFileType & "~|~" &_
            strFileDateCreated & "~|~" &_
            strFileDateLastAccessed & "~|~" &_
            strFileDateLastModified & "~|~" &_
            strFileOwner & vbCrLf
'               End If
    End If
Next   
ShowSubFolders Subfolder
Next
End Sub

1 个答案:

答案 0 :(得分:0)

由于您没有提供完整的脚本,因为您引用了未在您提供的代码中实例化的对象,因此告诉您如何操作有点困难。

是的,您可以将每个文件夹的输出写入新文件以及可用内存。您需要稍微更改脚本的结构。我正在为你做这件事,直到我遇到更多未定义的物品并放弃,所以我只是告诉你该做什么。

你不需要两个潜艇,只有一个潜艇。这是结构的轮廓:

Dim fso, startfolder
Set fso = CreateObject("Scripting.FileSystemObject")

startfolder = "C:\temp"
GetFileInfo startfolder

Sub GetFileInfo(folderpath)
    On Error Resume Next
    Dim file, logpath, logfile, folder
    logpath = "C:\log\" & fso.GetBaseName(folderpath) & ".log" ' C:\log folder must exist; but of course edit path and file name conventions as desired
    Set logfile = fso.OpenTextFile(logpath, 2, True)
    If Err Then EchoAndQuit "Failed to create log " & logpath & ": " & Err.Description

    ' Write the file info in current folder
    For Each file In fso.GetFolder(folderpath).Files
        logfile.WriteLine file.Name ' file/security info
    Next

    'Set x = Nothing (Set objects instantiated in this sub to nothing to release memory)

    ' Now the recursive bit
    For Each folder In fso.GetFolder(folderpath).SubFolders
        GetFileInfo(folder.Path)
    Next

    On Error GoTo 0
End Sub


Sub EchoAndQuit(msg)
    MsgBox msg, 4096 + 16, "Failed"
    WScript.Quit
End Sub

这样做的一个问题是,如果您有多个具有相同名称的文件夹,您将收到拒绝访问错误 - 我将留给您制定一些检查/命名约定以避免这种情况。 (您可以通过设置logfile = nothing来解决它,但如果有多个具有相同名称的文件夹,您将覆盖现有的日志文件。这样您可以解决一些问题,一些日志文件检查/命名解决重复名称问题的惯例,然后你可以根据需要销毁对象。)