我正在嘗試自動備份 Windows 2003 R2 伺服器上的資料夾(目前是手動程序)。
此任務包含三個組成部分:
1)在同一目錄下產生以下資料夾的zip文件,不使用第3方軟體:
d:\source\folder_to_back_up
這給了我們:
d:\source\folder_to_back_up.zip
2) 將新建立的 zip 檔案移到:
d:\destination
3) 根據以下命名約定重命名 zip 檔案:
Backup_YYYYMMDD.zip
例如,使用今天的日期,名稱將為:
Backup_20150516.zip
到目前為止,我已經找到如何自動化第 2 步:
robocopy /mov d:\source d:\destination folder_to_back_up.zip
……但需要一些幫助來自動建立 zip 檔案以及重命名步驟。
任何想法將不勝感激!
答案1
由於您在其他答案的評論中開始考慮 7-zip,因此我是這樣做的:
set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination
rem # a: Add, -mx: compression level 0-9, -tzip use ZIP format, -ssc: case sensitive, -ssw: add files opened for writing, -r: recursive
pushd "%SOURCE%" && 7za a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd
請注意,如果您內聯源變量和目標變量,這本質上是一行。pushd
/對popd
的存在是為了在您在一批中進行多個備份時上下文不會改變。%date%
是一個內建的。
我認為在沒有適當工具的情況下創建特殊文件格式(zip)是不合理的。這就像想在沒有JDK的情況下將Java原始碼編譯成jar一樣。
依賴關係
您可以透過將上述程式碼放入backup_stuff.bat
並複製到7za.exe
該檔案旁邊來解決刪除工具的問題backup_stuff.bat-7za.exe
,然後您只需將其替換7za
為%~dp0\backup_stuff.bat-7za
即可準確引用該檔案。這應該傳達這樣的訊息:這裡存在外部依賴項...
或者,如果您真的想變得偏執,只需將 7zip 嵌入到批次檔中:)
set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination
goto deps
:exec
pushd "%SOURCE%" && "%TEMP%\7za" a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd
goto end
:deps
@(
rem This is the Base64 enconded version of 7za.exe
rem To create this section execute the following commands:
rem certutil -encode 7za.exe 7za.exe.b64
rem echo @echo off>7za.exe.b64.bat && for /F "tokens=*" %L in (7za.exe.b64) do @echo echo %L>>7za.exe.b64.bat
echo -----BEGIN CERTIFICATE-----
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAA+AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
echo dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAB9EXJSOXAcATlwHAE5cBwB
echo QmwQATtwHAG6bBIBIHAcAQ9WFgFbcBwBt3hDAThwHAE5cB0BlnAcAbp4QQE+cBwB
rem ... lot of lines ommitted for sake of stackoverflow
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo -----END CERTIFICATE-----
)>%TEMP%\7za.exe.b64
certutil -decode -f %TEMP%\7za.exe.b64 %TEMP%\7za.exe >NUL
goto exec
:end
當我嘗試使用原始 7-zip v9.20 exe 檔案執行此操作時,我的 cmd 崩潰了。看起來塊長度有限制(...)
,我發現它在 370kB 左右(大約 5000 行 b64)。 7-zip 的原始 base64 是 800kB,但這並不是什麼大問題,因為它可以分割成多個區塊,@(...)>>target.file
而這些區塊都在限制範圍內。但我建議運行通過upx --brute 7za.exe
,使exe檔大小小於300kB。
來源
答案2
您可以從批次檔建立 zip 檔案。這可以使用 Microsoft Windows 中的 Shell.Application 軟體程式碼來完成,也可以使用命令列來完成,但需要一些額外的程式碼。例如,Ansgar Wiechers 對使用者2868186問題的回答包含看起來很可靠的程式碼(靠近底部)。作為備選,Rob Vanderwoude 在 VBS 上的頁面也展示了一個解決方案。
您可能不喜歡需要 8-12 行(估計數量)的 VBScript。嗯,這是我發現的最好的可用方法,可以在依賴添加到 MS Windows 的最少程式碼的情況下實現自動化。我不認為 MS Windows(至少不是您要求的版本)提供了一種用更少的程式碼來做到這一點的方法。
但是,如果您要定期添加該程式碼,那麼您可能需要下載它,而不是多次鍵入它。如果您要下載它,我建議您最好下載一些其他程式碼,例如 7-Zip 或 Info-Zip。 7-Zip 可能需要更多時間來學習如何從命令列使用它,但我已經成功使用它。如果您不會多次執行此操作,那麼從長遠來看,添加一次軟體可能是一個很好的解決方案(最少的時間投資,長期回報)的另一個原因。我知道使用此類軟體並不完全符合您的要求,但無論如何我都會提出這一點,因為我建議認真考慮這是否最終是最好的解決方案。
關於第三步,請將以下內容放入批次檔中:
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b) echo %mydate%
請注意,顯示的 FOR 命令旨在從批次檔執行。嘗試在批次檔之外執行完全相同的命令也不會起作用。我在Win7 SP1下測試過。我沒有方便測試的 2003 R2 伺服器,但我猜這種方法對您來說會很有效。
謹此致謝傑伊對羅裡關於時間的問題的回答作為該方法的基礎。