1. 程式人生 > >forfiles 和 xcopy 在windows下拷貝N天內更改過的檔案

forfiles 和 xcopy 在windows下拷貝N天內更改過的檔案



資料庫備份,只需要拷貝最近1個月內的資料庫備份到另一臺伺服器就行.
而且只是用windows作業來執行.
由於對windows命令也不太熟悉,使用命令的時候真是黔驢盡窮啊!~
要什麼命令沒什麼,各種計算都不方便.
為了這日期的計算,花了很長時間.
網上最多的也是最簡單的,也就是分別取出年月日,做加減後再拼接回來.
如:
echo %date:~0,4%-%date:~5,2%-%date:~8,2%

那麼,問題來了.單獨用月或日期做加減,月份有可能小於0,或者大於12.日期同理.

-----------------------------------------------------------------------

由於命令[xcopy]沒有日期篩選,只能先從其他命令篩選出符合條件的檔案再複製.
想起了一個命令[forfiles],有日期選擇.高興之餘測試一下.發現選項[/d]的功能用不了

forfiles /d 

功能介紹如下:
選擇檔案,其上一次修改日期大於或等於 (+),或者小於或等於 (-) 用 "yyyy-MM-dd" 格式指定的日期;
或選擇檔案,其上一次修改日期大於或等於 (+)當前日期加 "dd" 天,
或者小於或等於 (-) 當前日期減 "dd" 天。有效的 "dd" 天數可以是0 - 32768 範圍內的任何數字。
如果沒有指定,"+" 被當作預設符號。

測試一下,只發現減號(-)能用,加號(+)不能用。即只能查到更改N天之前的檔案,不能查更改在N天之內的檔案!~
不過能找到就不錯了。就用這個命令吧!

-----------------------------------------------------------------------

後來在這裡找到了“同樣”問題解決方法:
http://bbs.csdn.net/topics/310080657




@echo off
rem 將指定目錄的所有檔案及資料夾copy到指定目錄下,只copy 7天內建立的或是7天內修改過的
rem author:perfectaction

set "src=c:\test\" rem 源目錄路徑
set "des=d:\test\" rem 目標路徑
set "suffix=txt"   rem 需要xcopy的檔案字尾
set "dd=7"         rem 只copy7天之內的檔案

del /f /q /a "%src%notcopylist_%suffix%.log" 2>nul
forfiles /p %src% /s /m *.* /d -%dd% /c "cmd /c dir @path /b /s >>%src%notcopylist_%suffix%.log"
if not exist "%src%notcopylist_%suffix%.log\" (
  if exist "%src%notcopylist_%suffix%.log" (
    xcopy "%src%*.%suffix%" "%des%" /s /d /y /EXCLUDE:%src%notcopylist_%suffix%.log
  ) else (
    xcopy "%src%*.%suffix%" "%des%" /s /d /y
  )
) else (
  echo 錯誤:無法建立%src%notcopylist_%suffix%.log檔案,當前目錄存在同名資料夾。
)
rem pause


-----------------------------------------------------------------------

試用發現不行,嫌著麻煩,不用這個了,自己改吧:

#1.輸入目錄(E:\歷史檔案A\*.txt)下的所有檔名稱(路徑+檔名)到檔案中outfile.txt
#第一行,輸出路徑無引號,如:E:\歷史檔案A\20140812.txt
#第二行,輸出路徑有引號(不用這個)如:"E:\歷史檔案A\20140812.txt"
forfiles /p "E:\歷史檔案A" /m *.txt /d -30 /c "cmd /c dir @path /b/s" >"E:\outfile.txt"
--forfiles /p "E:\歷史檔案A" /m *.txt /d -7 /c "cmd /c echo @path" >E:\outfile.txt


#2.再執行復制,同時用EXCLUDE用於排除不復制的檔案
xcopy "E:\歷史檔案A\*.txt" "E:\歷史檔案B\" /d /y /EXCLUDE:E:\outfile.txt 

成功!!~~

-----------------------------------------------------------------------

最終命令:
backup.bat

forfiles /p "E:\歷史檔案A" /m *.txt /d -30 /c "cmd /c dir @path /b/s" >"E:\outfile.txt"
xcopy "E:\歷史檔案A\*.txt" "E:\歷史檔案B\" /d /y /EXCLUDE:E:\outfile.txt 

-----------------------------------------------------------------------

#檢視命令使用說明
Forfiles /?

命令引數[/c]可用變數說明:
變數描述
@file檔名
@fname無副檔名的檔名
@ext副檔名
@path檔案的完整路徑
@relpath檔案的相對路徑
@isdir如果檔案型別是目錄,則計算值為 TRUE,否則值為 FALSE
@fsize用位元組表示的檔案大小
@fdate檔案中上次修改的日期戳
@ftime檔案中上次修改的時間戳


-----------------------------------------------------------------------