【问题标题】:unable to zip 1 GB file using VBScript无法使用 VBScript 压缩 1 GB 文件
【发布时间】:2013-04-29 07:35:06
【问题描述】:

我有一个执行以下任务的批处理脚本。
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,则会出现同样的错误。是因为文件大吗?

【问题讨论】:

  • VBScript 只是创建了一个空的 zip 文件,即 File_2013-04-29.log.zip 但它无法添加 .log 文件并删除原始文件。

标签: vbscript batch-file windows-server-2008-r2


【解决方案1】:

这绝对是内存问题,因为应用程序的上限为 2GB,至少在 Windows 中,这很可能是程序试图访问未分配的内存的问题。

【讨论】:

  • 有什么办法可以克服这个限制吗?
  • 有一种方法可以将其扩展到 3GB,但我很确定这需要 win32 api 访问。由于操作系统的限制,这是不可能的。
  • 我的要求是具有 VBScript 的压缩功能,可以压缩最大为 1 GB 的文件。是否可以单独修改VBScript?
  • 理论上您可以修改脚本以一次只运行文件的一小部分。这样您就可以控制使用了多少内存。
  • 由于我对VBScript的了解有限,我无法修改脚本来实现上述逻辑。增加更多的睡眠时间怎么样?例如,使用WScript.Sleep(10000),该脚本在 200MB 文件大小下运行良好。刚刚试过。
【解决方案2】:

替代解决方案

将大日志文件分成小块:

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"

【讨论】:

  • 我会试试你的解决方案。但到目前为止,我将坚持我之前提到的任何内容:根据大小增加睡眠时间。非常感谢 Elektro。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2022-09-29
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多