せずに、私は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:\Destination
で
RunBackups.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(?)がこの問題を回避する可能性があると聞いたことがありますが、これがうまくいくかどうかはわかりません。 (技術的な知識が限られているため)
これは実際に機能しました!しかし、より大きな.zipファイルを作成すると、圧縮インターフェイスが表示されます。これが起こらない方法がありますか? (圧縮プロセスがバックグラウンドで実行される) –
[copyhereのドキュメント](https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85)) .aspx)には進行状況ダイアログを非表示にするフラグがありますが、何らかの理由でzipファイルで動作しないようです。 – garbb
十分に公正。フォローアップの質問:.zipにコピーされたファイルの数を何らかの形で(.logファイルでの記録に使用するために)カウントすることは可能ですか?例えば'Set FileCount = CountOfFilesZipped'そしてその後' Echo%FileCount% ' - もしそうなら、どうすれば実装できますか? - **作成後の.zipファイル内のファイルの数がこの目的のために機能します** –