1

次のタスクを実行するバッチ スクリプトがあります。
1. バックアップ フォルダを作成する
2. 特定のファイル (.log 形式のテキスト ファイル) を圧縮し、圧縮したファイルをバックアップ フォルダ
に移動する 3. 移動後に元のファイルを削除する

2 番目のタスクを達成するために、以下のようにバッチ スクリプトから 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 を単独で実行すると、同じエラーが発生します。ファイルサイズが大きいためでしょうか?

4

2 に答える 2

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()

次に、すべてをまとめて圧縮し、コンテンツを抽出するときに、次のような「Copy /B」バッチ コマンドを使用してチャンクを結合します。

Copy /B "MyLog_Part*" "MyLog_Complete.log"
于 2013-04-29T11:28:32.137 に答える
0

アプリケーションが最大 2GB に制限されていることを考えると、これは間違いなくメモリの問題であり、少なくとも Windows 内では、割り当てられていないメモリにアクセスしようとするプログラムの問題である可能性が最も高いです。

于 2013-04-29T07:37:56.483 に答える