set LogPath= C:\logs
set Logbak= C:\logs\bak
set keepdays=7
echo %date%
set x=%date:~5,2%%date:~8,2%
mkdir %Logbak%\%x%
move %LogPath%\ %Logbak%\%x%
cd %SystemRoot%\system32
forfiles /p %Logbak% /d -%keepdays% /c "cmd /c echo deleting @file && del /f @path"
不確定有沒有問題 @@;....
這功能我實作過
你要怎麼做?
一、將資料壓縮成一個檔案,不要用資料夾,難維護、難管理,難控制大小
用win rar 就能將檔案壓縮,並加上密碼。
二、時間 日期 可以用 cmd 取得,要將壓縮檔以時間重新『自由命名』是很容易的事
三、先進先出,如何將七天前的檔案刪除?
不從刪除七天前的檔案下手,你光時間就搞不定,今天 三月3號,請問七天前是幾月幾日?
要從『留下』幾個檔案下手(這就是為什麼要壓縮成一個檔案的一個重點)
刪除七天前的檔案 等於 要留下最新的 六個檔案
要數有幾個檔案比較簡單,
set /a FileCount=0
FOR /f "tokens=*" %%P IN ('dir /od /b 2^>NUL') do set /a FileCount+=1
用for /f + dir /od /b 就能數出目前有幾個檔案
用 set +if 就算出有幾個檔案要刪除
set /a FileDel=0
if %FileCount% GEQ %FileSaveMax% (set /a FileDel=FileCount-%FileSaveMax% )
echo file delete number is %FileDel%
用 for
FOR /F %%N IN ('dir /od /b 2^>NUL') DO (call :Function5 %%N")
就能實做出刪除檔案的功能,再用 FileDel 控制要刪除幾個
:Function5
if %FileDel% GTR 0 (
set /a FileDel-=1
del %1%2%3
)
goto :eof
將能將多的檔案刪除。
整個的做法基本上就是這樣,只要會用 set if for goto 就做的出來
用 PowerShell 的方式
#新增當天目錄$CurrentDirDate = Get-Date -Format yyyyMMdd New-Item -type directory -path \$CurrentDirDate
#備份Copy-Item C:\Backup\*.bak -destination .\$CurrentDirDate
#計算從今日之前的 7 日是幾號$7days = (Get-Date) - (New-TimeSpan -Days 7)
#轉換為字串格式$7days = $7days.ToString("yyyyMMdd")
#刪除七日前目錄Remove-Item -Path .\$7days -Recurse
這是我用來在linux上備份postgresql的python,要移植過來windows應該不難,供參考。
用bat寫會很難,尤其日期的部份,建議可以朝powershell這邊去下手,或是改改我的東西。
from datetime import date, timedelta, datetime
import os
# 存放備份的資料夾
base_dir = "/mnt/dbbackup/"
# 備分天數
timedelta_obj = timedelta(days=3)
today = date.today()
# 執行備份之命令,檔名範例為"cpco_2017-04-15.gz"
os.system(r'pg_dumpall |gzip -c > ' + os.path.join(base_dir,"cpco_" + str(today)+ ".gz"))
for root, dirs, files in os.walk(base_dir):
for file in files:
# "backupdb.py"為備份執行檔本身、".backupdb.py.swp"為執行檔暫存,不處理
if file in ["backupdb.py", ".backupdb.py.swp"]:
pass
# 超過3日之備份檔刪除
else:
# 依檔名判斷日期,並將日期轉換為date物件處理
the_date = file.split("_")[1].split(".")[0]
the_date_obj = datetime.strptime(the_date, "%Y-%m-%d").date()
if today - the_date_obj >= timedelta_obj:
os.remove(os.path.join(base_dir,file))