2017-11-21 5 views
0

せずに、私はC:\SourceからC:\Destinationに位置.zipファイルにすべてをバックアップするために使用作成した.zipファイルのフォルダを(移入の問題を抱えている、VBSを使用して.zipファイルのバックアップを作成します)。この問題はZipCMD.vbsファイルで発生します。私は今私の全プロセスを説明し、最後に大胆に、私は問題と私の試みた(そして失敗した)解決策を説明します。ハードコードされた待ちタイマ(Windows 7の)

は(ゲルハルト・バーナードの功績)

Set objArgs = WScript.Arguments 
Set FS = CreateObject("Scripting.FileSystemObject") 
InputFolder = FS.GetAbsolutePathName(objArgs(0)) 
ZipFile = FS.GetAbsolutePathName(objArgs(1)) 

CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar) 

Set objShell = CreateObject("Shell.Application") 
Set source = objShell.NameSpace(InputFolder).Items 

objShell.NameSpace(ZipFile).CopyHere(source) 
WScript.Sleep 3000 

私もでBackups.batを作成したメモ帳に次のコードを使用してZipCMD.vbsを作成し、C:\Destination

C:\Sourceで、テストデータを格納しているフォルダが存在しますC:\Destinationメモ帳で次のコードを使用します。

@echo off 
for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find "."') do set dt=%%a 
set YYYY=%dt:~0,4% 
set MM=%dt:~4,2% 
set DD=%dt:~6,2% 
set HH=%dt:~8,2% 
set Min=%dt:~10,2% 
set Sec=%dt:~12,2% 
set stamp=%YYYY%%MM%%DD%%HH%%Min% 
rem Parameters set for use later 


ZipCMD.vbs "C:\Source" "C:\Destination\BackupTest1.zip" 
rem This line copies all files and folders from the Source to the Destination into a named .zip, without a date, by utilising the VBS created earlier. 

Del "C:\Destination\*_BackupTest1.zip" 
rem This line deletes the old backup (All **final** backups are named using 'YYYYMMDDhhmm_BackupTest1.zip'). The '_' prevents this command deleting the newly-created zip from before. 

Rename C:\Destination\BackupTest1.zip %Stamp%_BackupTest1.zip 
rem Renames newly-created zip file with datestamp and underscore (for information, and so that it can be identified for deletion next time this is run). 

Set File="*_BackupTest1.zip" 
FOR /F "usebackq" %%A IN ('%file%') DO set size=%%~zA 
rem These lines define a new parameter defined by the created .zip's size 

Echo %stamp%%Sec% %stamp%_BackupTest1.zip %Size%>>BackupLog.log 
rem This last line appends a line to a log file containing the time the zip was created, the name of the .zip created, and its' size. 

上記の.batの2番目のセクション(初期パラメータの定義後)は、複数のフォルダに対して繰り返されますが、毎回 'Source'が変更されます。

最後に、私はこれが(すなわち「サイレント」モードで実行されている)黒CMDウィンドウが表示されなくても、.BATを実行し、あるメモ帳

に次のコードを使用して C:\DestinationRunBackups.vbs
Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "C:\[SyncFolder]\Backups.bat" & Chr(34), 0 
Set WshShell = Nothing 

を作成ファイルタスクスケジューラを使用してバックアッププロセスを自動化するように私は頼みます。

問題:WScript.Sleep 3000の行は、ZipCMD.vbsが割り込みです。 .zipファイル全体を<に3秒間作成することができます。それ以外の場合は、機能しないバックアップがあります。このタイマーを拡張すると、大規模または複数のバックアップで問題が発生する可能性があります。

  • ソリューションの試み#1:ZipCMD.vbsでは、3000待機を置き換える、.zipファイルは名前= ZIPファイルで作成されているかどうかをチェックするループを開始します。これにより、正しい名前の.zipが作成されますが、データは含まれません(つまり、バックアッププロセスで.zipが作成されましたが、データ/ファイルを作成する前にvbsが閉じられました)。
  • ソリューションの試行#2:In ZipCMD.vbs、3000待機を置き換え、Sourceのファイル数をカウントし、.zipにその数のファイルが含まれるまで待機(ループ)し、各チェックの間に500msの遅延を待ちます。問題:これは、コピーされる最後のファイルを除くすべてのファイルに対して完全に機能します。最後のファイルを< 500msにコピーすることができます。そうしないと、最後のファイルはコピーされません。このタイマーを拡張すると、非常に大きなファイルを含むバックアップに問題が発生する可能性があります。

質問:私はデフォルト以外の、Windowsの機能を使用せずに、.zipファイルは(単に巨大なタイマーを設定せずに)完全たびに作成されていることを確認するために、とタイマーを「待って」とは何を置き換えることができます? (サードパーティ以外の(例:7zip))

Java/Javascript(?)がこの問題を回避する可能性があると聞いたことがありますが、これがうまくいくかどうかはわかりません。 (技術的な知識が限られているため)

答えて

1

このZipCMDを試してみてください。zipファイルには、私はそれはそれは時折なるだろうエラーを無視しなければならなかった以外その中のすべてのアイテムを持ってまで、VBS

Set objArgs = WScript.Arguments 
Set FS = CreateObject("Scripting.FileSystemObject") 
InputFolder = FS.GetAbsolutePathName(objArgs(0)) 
ZipFile = FS.GetAbsolutePathName(objArgs(1)) 

CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar) 

Set objShell = CreateObject("Shell.Application") 
Set source = objShell.NameSpace(InputFolder).Items 

numfolderitems = objShell.NameSpace(InputFolder).Items.count 

objShell.NameSpace(ZipFile).CopyHere(source) 

' wait until number of items in zip file is the same as in the folder we are zipping up 
' also sometimes gets errors when getting folder object for zip file, probably because it is in use? so ignore these 
On Error Resume Next 
Do while True 
    numitemsinzip = objShell.NameSpace(ZipFile).Items.count 
    If Err.Number = 0 and numitemsinzip = numfolderitems Then 
     Exit Do 
    ElseIf Err.Number <> 0 then 
     Err.Clear 
    End If 
    wScript.Sleep 10 
Loop 
On Error Goto 0 

これは基本的に待っているのあなたの溶液#2です。私はそれを数回テストしたが、うまくいくと思われる。唯一の潜在的な問題は、ジップ操作が何らかの理由で停止し、すべてのファイルがzipファイルに入れられないため、wscript.exeプロセスが永久に実行される場合です。

+0

これは実際に機能しました!しかし、より大きな.zipファイルを作成すると、圧縮インターフェイスが表示されます。これが起こらない方法がありますか? (圧縮プロセスがバックグラウンドで実行される) –

+0

[copyhereのドキュメント](https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85)) .aspx)には進行状況ダイアログを非表示にするフラグがありますが、何らかの理由でzipファイルで動作しないようです。 – garbb

+0

十分に公正。フォローアップの質問:.zipにコピーされたファイルの数を何らかの形で(.logファイルでの記録に使用するために)カウントすることは可能ですか?例えば'Set FileCount = CountOfFilesZipped'そしてその後' Echo%FileCount% ' - もしそうなら、どうすれば実装できますか? - **作成後の.zipファイル内のファイルの数がこの目的のために機能します** –

関連する問題