
我正在使用 7-zip 將磁碟上的資料夾備份到網路儲存上的 7z 檔案中。每次執行備份腳本時,它都會以 7-zip 更新模式更新現有存檔(從磁碟壓縮新檔案並從舊存檔複製未更改的檔案)。它工作正常,但需要透過網路對每個檔案進行兩次完整的傳輸。
現在,自上次備份作業以來,資料夾內容通常根本沒有更改,因此跳過整個操作並保留舊存檔原樣會更有效。我怎樣才能實現這個目標?
答案1
新增“-stl”選項將存檔日期/時間設定為上次修改文件的日期/時間。我將測試存檔設定為唯讀,當我在沒有更改任何檔案的情況下「更新」時,7zip 沒有出現任何錯誤。警告:當也使用“-mhe=on”選項時,則內容檔案館的是已更改,但僅當更新與上一次更新不在同一分鐘內發生時。換句話說,「-mhe=on」總是重新加密並重新儲存標頭,並且顯然使用當前時間(以分鐘為單位)。
答案2
根據手動的,您應該能夠指定以下組合狀態和行動與-u切換以精確控制您希望更新存檔的情況:
作為範例演示,7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off
建立一個新存檔更新.7z並將當前目錄中與目錄中的檔案不同的所有檔案寫入此存檔存在.7z檔案。如果省略 !後面跟著新的存檔名稱,如果滿足指定的條件,則僅更新基本或現有存檔。
答案3
我擴展了卡蘭的答案,同時保留了備份存檔的上次修改時間
Windows批次非常有限,我只能透過使用使這個腳本工作尼爾命令- Windows 命令列工具
這是一個批次腳本,使用7-拉鍊和尼爾命令建立備份檔案或僅在來源目錄變更時更新它們,同時保留存檔修改時間,以防止其他程式偵測到存檔已更改,從而防止不必要的上傳。
@ECHO OFF
SET BaseDir=c:\Users
SET BkpsDir=d:\Backup
IF NOT EXIST "7za.exe" GOTO ExitError
IF NOT EXIST "nircmd.exe" GOTO ExitError
SET TimeFile=%temp%\tmpCloneFileTimeFile.bkp
SET OutputFile=%temp%\tmpOutputFile.bkp
REM create a temporary file
copy /y NUL "%TimeFile%" 1>NUL
CALL :CompressDirIfChanged Public\Music PublicMusic.7z
CALL :CompressDirIfChanged Dragos\Favorites DragosFavorites.7z
DEL "%TimeFile%" /F /Q >nul 2>nul
DEL "%OutputFile%" /F /Q >nul 2>nul
ECHO.
ECHO SUCCESS
ECHO.
PAUSE
EXIT
goto:eof
REM call :CompressDirIfChanged sourceDirRelativeToBaseDir ArchiveName
:CompressDirIfChanged
SET BkpSrc="%~1"
SET ArchDest=%BkpsDir%\%~2
CD "%BaseDir%"
IF EXIST "%ArchDest%" (
nircmd.exe clonefiletime "%ArchDest%" "%TimeFile%"
7za.exe u -up1q0r2x1y2z1w2 -mx=9 "%ArchDest%" "%BkpSrc%" 1>"%OutputFile%"
IF errorlevel 1 GOTO ExitError
FINDSTR /bli /c:"Items to compress: 0" "%OutputFile%" && FINDSTR /bli /c:"Files read from disk: 0" "%OutputFile%" && (
ECHO - no changes in %BkpSrc%, restoring Last Modified Time
nircmd.exe clonefiletime "%TimeFile%" "%ArchDest%"
) || (
ECHO - updating %ArchDest%
)
) ELSE (
ECHO - creating %ArchDest%
7za.exe a -aoa -mx=9 "%ArchDest%" "%BkpSrc%" 1>nul
IF errorlevel 1 GOTO ExitError
)
goto:eof
:ExitError
ECHO ERROR!
PAUSE
EXIT 1
goto:eof