我有一个批处理脚本,可执行以下任务
1.创建备份文件夹
2.压缩特定文件(.log格式的文本文件)并将压缩文件移动到备份文件夹
3.移动后删除原始文件
要完成第二项任务,我将命令从批处理脚本编写到VBScript文件中,如下所示,然后在批处理脚本结束时执行VBScript。
echo Option Explicit >> zipIt.vbs
REM remaining commands
CScript zipIt.vbs
批处理脚本成功执行大小为100 MB的文件的所有3个任务。 但是对于大小为1 GB的文件,VBScript命令失败了。在命令提示符处抛出以下错误
C:\Users\Administrator\Desktop\zipIt.vbs(18, 1) Microsoft VBScript runtime error
: Permission denied
为方便起见,下面是zipIt.vbs书面行号的内容。
1. Option Explicit
2. Dim FileToZip, Result
3. Dim oShell
4. Dim file
5. Dim oFileSys
6. Dim winShell
7. FileToZip = "C:\Program Files\logs\File_2013-04-29.log"
8. Result = "C:\Program Files\logs\File_2013-04-29.log.zip"
9. Set oShell = CreateObject("WScript.Shell")
10. Set oFileSys = CreateObject("Scripting.FileSystemObject")
11. Set file = oFileSys.CreateTextFile(Result, True)
12. file.Write "PK" & Chr(5) & Chr(6) & String(18, 0)
13. file.Close
14. Set file = nothing
15. set winShell = createObject("shell.application")
16. winShell.namespace(Result).CopyHere FileToZip
17. wScript.Sleep(5000)
18. oFileSys.DeleteFile FileToZip
如果单独运行VBScript,则会出现相同的错误。是因为文件很大吗?
答案 0 :(得分:0)
这绝对是内存问题,因为应用程序的上限最大为2GB,至少在Windows中,这很可能是程序尝试访问未分配的内存的问题。
答案 1 :(得分:0)
替代解决方案
以小块分割大型日志文件:
BreakFile = "C:\Users\Administrador\Desktop\Test.txt"
limit = 400000 ' Bytes
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(Breakfile, 1)
FiletoSplit = objFSO.GetFileName(BreakFile)
FolderDest = Mid(objFSO.GetAbsolutePathName(BreakFile),1,Len(objFSO.GetAbsolutePathName(BreakFile))-(Len(FiletoSplit)))
FileSplitName = objFSO.GetBaseName(BreakFile)
dtmStart = Now()
Set objFile = objFSO.OpenTextFile(Breakfile, 1)
strContents = objFile.ReadAll
FileNum = 1
fname = FolderDest & FileSplitName & "Split " & FileNum & ".txt"
Set objFile1 = objFSO.OpenTextFile(fname, 2, True)
CountLines = 0
arrLines = Split(strContents, vbCrLf)
HeaderText = arrLines(0)
For i = 0 to ubound(arrlines)
strLine = arrLines(i) & vbCrLf
objFile1.Write strLine
If (Countlines) < limit Then
countlines = countlines + 1
ElseIf Countlines >= limit Then
objFile1.Close
Countlines = 0
FileNum = FileNum + 1
fname = FolderDest & FileSplitName & "Split " & FileNum & ".txt"
Set objFile1 = objFSO.OpenTextFile(fname, 2, True)
objFile1.Write HeaderText & vbCrLf
End If
Next
objFile.Close
dtmEnd = Now()
然后将它们拼凑在一起,并在提取内容时,使用这样的“复制/ B”批处理命令来加入块:
Copy /B "MyLog_Part*" "MyLog_Complete.log"