iT邦幫忙

0

怎麼用cmd做出備份檔?

我想要每天建立一個新的資料夾備份資料,資料夾命名依照日期,如:4/25,命名為0425之類的,在用DOS寫出迴圈,刪除7天以前的備份資料夾?
萬分感謝!

丹尼 iT邦研究生 4 級 ‧ 2017-04-25 16:24:52 檢舉
用C語言 翻書學 複製貼上
froce iT邦高手 1 級 ‧ 2017-04-26 08:29:58 檢舉
用python好寫多了。我資料庫就是用python寫備份的script的。
直接用免費軟體就可以了
cbSetup或fbsetup
6
zenii
iT邦新手 5 級 ‧ 2017-04-25 17:36:07
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"

不確定有沒有問題 @@;....

0
eigen
iT邦新手 1 級 ‧ 2017-04-26 10:13:24

這功能我實作過

你要怎麼做?

一、將資料壓縮成一個檔案,不要用資料夾,難維護、難管理,難控制大小

用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 就做的出來

0
Daniel
iT邦新手 2 級 ‧ 2017-04-26 10:58:32

用 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

Daniel iT邦新手 2 級 ‧ 2017-04-26 11:03:02 檢舉

很多反斜線()被吃掉了,錢字號前面有點(.)的記得補回去

Daniel iT邦新手 2 級 ‧ 2017-04-26 15:15:14 檢舉

謝謝幫排版的高人

0
froce
iT邦高手 1 級 ‧ 2017-04-26 15:04:16

這是我用來在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))
eigen iT邦新手 1 級 ‧ 2017-04-26 17:57:44 檢舉

用bat的重點在於:每一台pc都能直接執行,不用安裝其它程式(這是整個的重要),如果要裝程式,這類型的程式多的是~~

froce iT邦高手 1 級 ‧ 2017-04-27 08:55:43 檢舉

這種備份反而是用在伺服器較多吧?裝了python要在windows下跑、要在linux下甚至MAC下跑都可以,學一套可以用在多個地方不好嗎?更何況我也只是拿出來參考,也提到了用powershell也是不錯的選擇。
bat真的很難入門,寫出的東西要維護也不容易,很難讀懂。

我要發表回答

立即登入回答