forfiles 和 xcopy 在windows下拷貝N天內更改過的檔案
阿新 • • 發佈:2019-01-25
資料庫備份,只需要拷貝最近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天之內的檔案!~
不過能找到就不錯了。就用這個命令吧!
-----------------------------------------------------------------------
後來在這裡找到了“同樣”問題解決方法:
@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檔案中上次修改的時間戳
-----------------------------------------------------------------------