vbscript优化:如何更快地编写文件

时间:2009-01-27 15:52:36

标签: optimization vbscript

以下是我在很多我的vbscripts中使用的常用日志功能,我会相应地修改它。我觉得写得太慢了。我有3个问题:

  1. 有关如何优化这一点以便更快写入的任何想法吗?
  2. 首先将所有文本存储在字符串中然后运行OutputToLog函数会更快还是每次我需要在文本文件中插入字符串时执行OutputToLog会更快?
  3. 如果驱动器空间不是一个因素,是否可能在执行期间写入文本文件时内存不足...导致脚本执行得越来越慢?
  4. 这是我的vbscript函数

    Function OutputToLog (strToAdd)  
        Dim strDirectory,strFile,strText, objFile,objFolder,objTextFile,objFSO
        strDirectory = "c:\log"
        strFile = "\log-"& StampNow &  ".bat"
        'strText = "test"
        strText = strToAdd
    
        ' Create the File System Object
        Set objFSO = CreateObject("Scripting.FileSystemObject")
    
        ' Check that the strDirectory folder exists
        If objFSO.FolderExists(strDirectory) Then
           Set objFolder = objFSO.GetFolder(strDirectory)
        Else
           Set objFolder = objFSO.CreateFolder(strDirectory)
           'WScript.Echo "Just created " & strDirectory
        End If
    
        If objFSO.FileExists(strDirectory & strFile) Then
           Set objFolder = objFSO.GetFolder(strDirectory)
        Else
           Set objFile = objFSO.CreateTextFile(strDirectory & strFile)
           'Wscript.Echo "Just created " & strDirectory & strFile
        End If
    
        set objFile = nothing
        set objFolder = nothing
        ' OpenTextFile Method needs a Const value
        ' ForAppending = 8 ForReading = 1, ForWriting = 2
        Const ForAppending = 8
    
        Set objTextFile = objFSO.OpenTextFile _
        (strDirectory & strFile, ForAppending, True)
    
        ' Writes strText every time you run this VBScript
        objTextFile.WriteLine(strText)
        objTextFile.Close
    End Function
    

    提前致谢

4 个答案:

答案 0 :(得分:1)

我认为你想要创建你的FSO对象并在OutputToLog函数之外打开你的日志文件。它可能不会节省太多时间,但为什么要创建对象,每次写入时打开和关闭文件?

否则,如果你想保持原样,只做一次写就应该更快。

答案 1 :(得分:0)

如果您正在进行大量的小写操作,那么重新构建FolderExists和FileExists的检查会有所帮助。也许尝试写入文件,捕获任何错误,并在错误处理程序中检查FolderExists和FileExists并在必要时创建它们?

输出一个大字符串而不是几个小字符串会更快,但如果程序崩溃,则必须平衡丢失日志条目的可能性。

除非你在文件中写一个 humungous 字符串,否则内存不应该是一个问题,甚至可能不是。

因为您要附加到文件,所以日志文件获取的时间越长,写入时间就越长,因为(AFAIK)每次都必须重写整个文件。这是不经常写较长字符串的另一个原因。

您可以使用Windows的“事件日志”吗?

答案 2 :(得分:0)

在准备功能中执行所有文件夹/文件检查和创建一次,然后您可以安全地附加到日志文件,知道它将存在吗?此外,您应该能够只创建一次fso对象。

类似以下内容(未经测试的代码)

Dim loggerFSO

Function PrepLog
    dim objFolder
    ' Create the File System Object
    if loggerFSO is nothing then Set loggerFSO = CreateObject("Scripting.FileSystemObject")

    ' Check that the strDirectory folder exists
    If loggerFSO.FolderExists(strDirectory) Then
       Set objFolder = loggerFSO.GetFolder(strDirectory)
    Else
       Set objFolder = loggerFSO.CreateFolder(strDirectory)
       'WScript.Echo "Just created " & strDirectory
    End If

    If loggerFSO.FileExists(strDirectory & strFile) Then
       ' do nothing
    Else
       loggerFSO.CreateTextFile(strDirectory & strFile)
       'Wscript.Echo "Just created " & strDirectory & strFile
    End If
End function

Function OutputToLog (strToAdd)  
    Dim strDirectory,strFile,strText, objTextFile
    strDirectory = "c:\log"
    strFile = "\log-"& StampNow &  ".bat"
    'strText = "test"
    strText = strToAdd

    ' Create the File System Object
    if loggerFSO is nothing then Set loggerFSO = CreateObject("Scripting.FileSystemObject")

    ' OpenTextFile Method needs a Const value
    ' ForAppending = 8 ForReading = 1, ForWriting = 2
    Const ForAppending = 8

    Set objTextFile = loggerFSO.OpenTextFile _
    (strDirectory & strFile, ForAppending, True)

    ' Writes strText every time you run this VBScript
    objTextFile.WriteLine(strText)
    objTextFile.Close
End Function

答案 3 :(得分:0)

不要在调用之间关闭文件,让textstream-object在终止时处理关闭。

Dim OutputToLogFileObject
Function OutputToLog (strToAdd)  
    Dim strDirectory,strFile,strText, objFile,objFolder,objTextFile,objFSO
    If IsEmpty(OutputToLogFileObject) Then
        strDirectory = "c:\log"
        strFile = "\log-"& StampNow &  ".bat"
        'strText = "test"
        strText = strToAdd

        ' Create the File System Object
        Set objFSO = CreateObject("Scripting.FileSystemObject")

        ' Check that the strDirectory folder exists
        If objFSO.FolderExists(strDirectory) Then
           Set objFolder = objFSO.GetFolder(strDirectory)
        Else
           Set objFolder = objFSO.CreateFolder(strDirectory)
           'WScript.Echo "Just created " & strDirectory
        End If

        If objFSO.FileExists(strDirectory & strFile) Then
           Set objFolder = objFSO.GetFolder(strDirectory)
        Else
           Set objFile = objFSO.CreateTextFile(strDirectory & strFile)
           'Wscript.Echo "Just created " & strDirectory & strFile
        End If

        set objFile = nothing
        set objFolder = nothing
        ' OpenTextFile Method needs a Const value
        ' ForAppending = 8 ForReading = 1, ForWriting = 2
        Const ForAppending = 8

        Set OutputToLogFileObject = objFSO.OpenTextFile _
        (strDirectory & strFile, ForAppending, True)
    End If
    OutputToLogFileObject.WriteLine strText
 End Function