dos批處理命令forfiles使用參數(shù)詳解
forfiles命令用法
forfiles是一款 windows 平臺(tái)的軟件工具,其中選擇文件并運(yùn)行一個(gè)命令來操作文件。文件選擇標(biāo)準(zhǔn)包括名稱和上次修改日期。命令說明符支持一些特殊的語法選項(xiàng)。它可以直接在命令行中使用,也可以在批處理文件或其他腳本中使用。
該forfiles命令最初作為加載項(xiàng)提供在Windows NT 資源工具包中。它成為Windows Vista的標(biāo)準(zhǔn)實(shí)用程序,作為新管理功能的一部分。
Forfiles:從文件夾或樹中選擇要進(jìn)行批處理的文件。
語法
forfiles [/p Path] [/m SearchMask] [/s] [/c Command] [/d[{+ | -}] [{MM/DD/YYYY | DD}]]
參數(shù)說明
forfiles命令有幾個(gè)命令行選項(xiàng)。如果沒有給出選項(xiàng)或參數(shù),它將輸出當(dāng)前目錄中每個(gè)文件的名稱。下面對(duì)一些參數(shù)進(jìn)行簡(jiǎn)單介紹:
/p Path
指定 Path,指定要從哪里開始搜索。默認(rèn)的文件夾是當(dāng)前工作目錄,該目錄通過鍵入句號(hào) (.) 指定。
注:
1.路徑應(yīng)該由反斜杠分割,如D:\rui\test
2.不接受UNC路徑(\ machine \ share)
/m SearchMask
按照 SearchMask 搜索文件。默認(rèn)的 SearchMask 是 *.*。
例如:我們想搜索rar文件 可以寫為 /m *.rar
/s
指示 forfiles 在子目錄中搜索。默認(rèn)情況下僅搜索單個(gè)指定目錄。
注:如果不加此參數(shù),只操作指定目錄下這一級(jí),反之指定目錄下所有層級(jí)目錄中的文件都會(huì)被操作。
/c Command
在每個(gè)匹配的文件上運(yùn)行指定的 Command,帶有空格的命令字符串必須用雙引號(hào)括起來。默認(rèn)的 Command 是 “cmd /c echo @file”。
/d[{+ | -}] [{MM/DD/YYYY | DD}]
根據(jù)上次修改日期選擇文件。選擇日期大于或等于 (+)(或者小于或等于 (-))指定日期的文件,有絕對(duì)日期和相對(duì)日期。
/?
顯示幫助消息(簡(jiǎn)要使用說明)。禁止文件搜索/命令執(zhí)行。不得與任何其它參數(shù)一起使用。
命令語法
下表列出了在 /c Command 命令字符串中能夠使用的變量。
變量 | 描述 |
---|---|
@file | 返回匹配項(xiàng)的名稱,雙引號(hào)。 |
@fname | 返回匹配項(xiàng)的基名(沒有文件擴(kuò)展名),雙引號(hào)。 |
@ext | 返回文件擴(kuò)展名,雙引號(hào),沒有前導(dǎo)點(diǎn)。如果文件有多個(gè)擴(kuò)展名,則只返回最后一個(gè)。如果文件沒有擴(kuò)展名,則返回帶引號(hào)的空字符串。 |
@path | 返回匹配項(xiàng)的完整路徑,雙引號(hào),包括驅(qū)動(dòng)器號(hào)和文件擴(kuò)展名(如果有)。 |
@relpath | 返回匹配項(xiàng)的相對(duì)路徑,雙引號(hào)和相對(duì)于起始目錄(由/ P給出)。每個(gè)路徑以點(diǎn)和反斜杠(.\)開頭。 |
@isdir | 如果文件類型是目錄,返回 TRUE,否則返回 FALSE。 |
@fsize | 返回用字節(jié)表示的文件大小 |
@fdate | 返回文件上次修改的日期,采用當(dāng)前用戶的本地化日期格式。 |
@ftime | 返回文件上次修改時(shí)間,采用當(dāng)前用戶的本地化時(shí)間格式。 |
日期語法
在給定日期參數(shù)的情況下,日期參數(shù)(/ D)根據(jù)上次修改日期選擇文件。
date參數(shù)可以作為文字日期給出,格式為MM / DD / YYYY(不接受其他日期格式)??商娲兀掌趨?shù)可以被給定為一個(gè)數(shù)字,在這種情況下,它被認(rèn)為是指在日齡時(shí)(即,天日期當(dāng)前日期的前幾天)。
如果date參數(shù)以減號(hào)( - )開頭,則僅選擇在給定日期或之前修改的文件(較舊的文件/先前修改過)。否則,僅選擇在給定日期或之后修改的文件(較年輕的文件/稍后修改)??梢越o出顯式加號(hào)(+),但這是默認(rèn)值。請(qǐng)注意,兩種模式都在給定日期選擇文件。無法僅在給定日期選擇文件(也不在之前或之后)。
示例
1.刪除D:/rui下2天前的.bak的文件
forfiles /p D:\rui /s /m *.bak /d -2 /c "cmd /c del /f @path"
2.列出D盤上的所有.bat文件
forfiles /p D:\ /s /m *.bat /c "cmd /c echo @file" --如果想加上說明文字,可以改動(dòng)如下: forfiles /p D:\ /s /m *.bat /c "cmd /c echo @file is a batch file"
3.列出D盤上的所有目錄
forfiles /p D:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
4.列出D盤上5天前的所有文件
forfiles /p D:\ /s /m *.* /d -5 /c "cmd /c echo @file : date >= 5 days"
5.列出D盤上2021年1月1日以前創(chuàng)建的文件,并顯示“file is quite old!”
forfiles /p D:\ /s /m *.* /dt-01011993 /c "cmd /c echo @file file is quite old!"
6.按列格式列出D盤上所有文件的擴(kuò)展名
forfiles /p D:\ /s /m *.* /c "cmd /c echo extension of @file is 0x09@ext0x09"
其它入門示例
要列出驅(qū)動(dòng)器C: 上的所有批處理文件,請(qǐng)鍵入:
forfiles /p c:\ /s /m*.bat /c"cmd /c echo @file is a batch file"
要列出驅(qū)動(dòng)器C: 上的所有目錄,請(qǐng)鍵入:
forfiles /p c:\ /s /m*.* /c"cmd /c if @isdir==true echo @file is a directory"
要列出驅(qū)動(dòng)器C: 上存在時(shí)間多于100 天的所有文件,請(qǐng)鍵入:
forfiles /p c:\ /s /m*.* /dt-100 /c"cmd /c echo @file :date >= 100 days"
要列出驅(qū)動(dòng)器C: 上1993 年1 月1 日以前創(chuàng)建的所有文件,而且對(duì)于日期早于1993 年1 月1 日的文件顯示“file is quite old!”,請(qǐng)鍵入:
forfiles /p c:\ /s /m*.* /dt-01011993 /c"cmd /c echo @file is quite old!"
要按列格式列出驅(qū)動(dòng)器C: 上所有文件的擴(kuò)展名,請(qǐng)鍵入:
forfiles /p c:\ /s /m*.* /c "cmd /c echo extension of @file is 0x09@ext0x09" With:
要列出驅(qū)動(dòng)器C: 上的所有批處理文件,請(qǐng)鍵入:
forfiles /p c:\ /s /m *.bat /c "cmd /c echo @file is a batch file"
要列出驅(qū)動(dòng)器C: 上的所有目錄,請(qǐng)鍵入:
forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
要列出驅(qū)動(dòng)器C: 上存在時(shí)間多于100 天的所有文件,請(qǐng)鍵入:
forfiles /p c:\ /s /m *.* /d t-100 /c "cmd /c echo @file :date >= 100 days"
要列出驅(qū)動(dòng)器C: 上1993 年1 月1 日以前創(chuàng)建的所有文件,而且對(duì)于日期早于1993 年1 月1 日的文件顯示“file is quite old!”,請(qǐng)鍵入:
forfiles /p c:\ /s /m *.* /d t-01011993 /c "cmd /c echo @file is quite old!"
要按列格式列出驅(qū)動(dòng)器C: 上所有文件的擴(kuò)展名,請(qǐng)鍵入:
forfiles /p c:\ /s /m*.* /c "cmd /c echo extension of @file is 0x09@ext0x09"
Windows Server 2003內(nèi)置的命令行文件,不適合于XP系統(tǒng)
1. 用批處理文件刪除當(dāng)前目錄下 7 天以前的擴(kuò)展名為bkf文件(以當(dāng)前系統(tǒng)時(shí)間為基準(zhǔn))
示例: forfiles /m *.bkf /d -7 /c "cmd /c del @file /f"
2. forfiles 自動(dòng)刪除7天前文件 (以當(dāng)前系統(tǒng)時(shí)間為基準(zhǔn))
示例: forfiles /p "d:\test" /s /m *.* /d -7 /c "cmd /c del @path"
d:\test換成你要的目錄路徑; /d -7 指刪除7天以前文件。
3. 刪除所有的空目錄(以刪除d:\test目錄下為例) :
dir /ad/b/s d:\test\ |sort /r >d:\kill.txt For /f "tokens=*" %%i in (d:\kill.txt) DO rd "%%i" del d:\kill.txt
4. 先刪7 天以前文件,再刪所有的空目錄 ;把以下復(fù)制到bat文件中。
@echo off
forfiles /p "d:\test" /s /m *.* /d -7 /c "cmd /c del @path"
dir /ad/b/s d:\test\ |sort /r >d:\kill.txt
For /f "tokens=*" %%i in (d:\kill.txt) DO rd "%%i"
del d:\kill.txt
5. forfiles 命令的用法及參數(shù):
forfiles /p <目標(biāo)目錄名> /d <天數(shù)> /c <執(zhí)行的命令>
/p 指定了要在哪個(gè)目錄里查找文件,默認(rèn)是當(dāng)前工作目錄。
/d 指定一個(gè)日期或天數(shù),用于比較文件的最后修改日期是否符合條件。
/c 對(duì)每個(gè)找到的文件執(zhí)行的命令。
例1.要把在C盤根目錄下最后修改日期大于或等于2010年1月7日的文件復(fù)制到D盤根目錄下:
forfiles /p "c:\" /d "2007-7-1" /c "cmd /c copy @path d:\"
例2.刪除在C盤backup目錄下最后修改日期在10天前的文件:
forfiles /p "c:\backup" /d -10 /c "cmd /c echo deleting @file ... && del /f @path"
6. forfiles /p 包含要?jiǎng)h除文件的完整路徑(如:F:\Logfiles) /m *.log -d -7 /c "cmd /c del /f
@path"
解釋一下相關(guān)參數(shù)及命令
/p <Path> : 指定開始搜索文件的位置,如果不指定則默認(rèn)為當(dāng)前目錄。
/m <SearchMask> : 文件查找所使用的通配符如代碼中的"*.log"則為所有日志文件,當(dāng)然也可以指定諸
如"manmee_*.log"這樣以manmee開頭的所有日志文件。如果不指定此參數(shù)則默認(rèn)為"*.*"。
/d [{+|-}][{<Date>|<Days>}] : 指定想選擇文件的最后修改時(shí)間,上文中用了 "/d -7" 表示所有以當(dāng)
天為基礎(chǔ),7天以前的文件。當(dāng)然這里還可以指定具體時(shí)間,例如:"/d -01/7/2010"這樣所有早于2010年
1月7日的文件。注意指定的時(shí)間必須是"MM/DD/YYYY"的格式。
/c 對(duì)所有文件以此執(zhí)行指定的命令,命令體須在雙引號(hào)(")內(nèi),默認(rèn)是"cmd /c echo @file"。上文中用
到的是"cmd /c del /f @path"刪除指定文件。(這里的@file 和 @path 為變量,下文中將解釋。)
下面說一下上文中用到的參數(shù):
@PATH : 表示文件的完整的路徑。
@File : 表示文件名稱。
接下來我們看看刪除文件夾的操作,如果你看了上面的介紹,相信這命令你一看就能看懂。
forfiles /p 包含文件夾的路徑(如:F:\) /m 文件夾名稱(如:LogFiles) -d 0 /c "cmd /c if @ISDIR
== true rd /s/q @path"
注意這里的"包含文件夾的路徑"不能包含要?jiǎng)h除的文件夾,如以上代碼所表示的就是,在F盤中查找名為
LogFiles的文件或文件夾(不能指定查找文件夾,不過在刪除時(shí)我們做了判斷)。
還有就是這里出現(xiàn)了一個(gè)新的參數(shù)"@ISDIR"他用于判斷當(dāng)前文件類型是否是"文件夾類型",如果是則為
true否則為false。
相信到這大家就明白了,最后再將代碼保存為批處理文件,然后加入計(jì)劃任務(wù)定期執(zhí)行即可。
看了上面的例子,覺得在 Windows Server 2003 下面要?jiǎng)h除老文件很簡(jiǎn)單吧。
但如果操作系統(tǒng)是 Windows 2000/XP 就比較麻煩,因?yàn)樗鼈儧]有forfiles命令,只能靠自己寫批處理來實(shí)現(xiàn)了。
下面是我寫的批處理文件內(nèi)容:
@echo off rem ****************************** rem * 按時(shí)間刪除文件目錄的批處理 * rem ****************************** rem 設(shè)置臨時(shí)目錄的路徑 set tempDir=%tmp%\remove_%date:~0,10% if not exist %tempDir% md %tempDir% rem 設(shè)置處理日期的腳本文件的路徑 set scriptFile=%tempDir%\get_date.vbs rem 獲得要保留的天數(shù) set days=%~1 if "%days%" == "" goto printUsage rem 獲得目標(biāo)目錄的路徑 set dirPath=%~2 if "%dirPath%" == "" set dirPath=. rem 獲得要操作的文件形式 set fileSpec=%~3 if "%fileSpec%" == "" set fileSpec=*.* rem 生成計(jì)算日期的腳本文件并獲得刪除的截止日期 echo d=date()-%1 > %scriptFile% echo s=right("0000" ^& year(d),4) ^& "-" ^& right("00" ^& month(d),2) ^& "-" ^& right("00" ^& day(d),2) >> %scriptFile% echo wscript.echo s >> %scriptFile% for /f %%i in ('cscript /nologo %scriptFile%') do set lastDate=%%i rem 處理目標(biāo)目錄里的每個(gè)對(duì)象 for /f "tokens=1,2,3* delims=<> " %%i in ('dir "%dirPath%\%fileSpec%" /a /-c /tc') do call :proc "%%i" "%%j" "%%k" "%%l" goto :done rem 處理目標(biāo)目錄里對(duì)象的過程 :proc rem 獲得對(duì)象的創(chuàng)建日期并判斷是否為有效格式 set fileDate=%~1 echo %fileDate% | findstr "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" > nul if errorlevel 1 goto end rem 獲得對(duì)象的類型 set fileType=%~3 if "%fileType%" == "" goto end rem 獲得對(duì)象的名稱 set fileName=%~4 if "%fileName%" == "" goto end if "%fileName%" == "." goto end if "%fileName%" == ".." goto end if "%fileName%" == "字節(jié)" goto end if "%fileName%" == "可用字節(jié)" goto end rem 判斷對(duì)象日期是否小于或等于刪除的截止日期 if "%fileDate:~0,10%" leq "%lastDate%" ( echo deleting "%fileName%" ... if "%fileType%" == "DIR" ( rd /s /q "%dirPath%\%fileName%" ) else ( del /q /f "%dirPath%\% fileName%" ) ) goto end :error echo An error occurred during backuping. :done rd /s /q %tempDir% goto end :printUsage echo Usage: %0 ^<Days^> [Work directory] [Target file specification (can include wildcards)] goto end :end
主要是利用Windows的腳本功能來計(jì)算要?jiǎng)h除文件的截止日期,然后for加dir命令來提取文件的日期進(jìn)行判斷。
通過批處理文件刪除超過3天的文件和文件夾
批處理文件是一種用于自動(dòng)化執(zhí)行一系列命令或操作的腳本文件。它可以在Windows操作系統(tǒng)中使用,通過命令行界面執(zhí)行。
刪除超過3天的文件和文件夾可以通過批處理文件來實(shí)現(xiàn)。下面是一個(gè)示例的批處理文件內(nèi)容:
@echo off setlocal rem 設(shè)置要?jiǎng)h除的目錄路徑 set "target_directory=C:\path\to\directory" rem 設(shè)置要?jiǎng)h除的文件和文件夾的最大存活時(shí)間(單位:天) set max_age=3 rem 獲取當(dāng)前日期和時(shí)間 for /f "tokens=1-3 delims=/ " %%a in ('date /t') do ( set "current_date=%%c-%%a-%%b" ) for /f "tokens=1-2 delims=: " %%a in ('time /t') do ( set "current_time=%%a%%b" ) rem 遍歷目標(biāo)目錄下的所有文件和文件夾 for /d %%i in ("%target_directory%\*") do ( rem 獲取文件夾的創(chuàng)建日期 for %%j in ("%%i\..") do set "folder_date=%%~tj" set "folder_date=!folder_date:~0,10!" rem 計(jì)算文件夾的存活時(shí)間 call :date_diff "!folder_date!" "!current_date!" days folder_age rem 如果文件夾的存活時(shí)間超過最大存活時(shí)間,則刪除文件夾及其內(nèi)容 if !folder_age! gtr %max_age% ( echo Deleting folder: %%i rd /s /q "%%i" ) ) rem 遍歷目標(biāo)目錄下的所有文件 for %%i in ("%target_directory%\*") do ( rem 獲取文件的創(chuàng)建日期 for %%j in ("%%i") do set "file_date=%%~tj" set "file_date=!file_date:~0,10!" rem 計(jì)算文件的存活時(shí)間 call :date_diff "!file_date!" "!current_date!" days file_age rem 如果文件的存活時(shí)間超過最大存活時(shí)間,則刪除文件 if !file_age! gtr %max_age% ( echo Deleting file: %%i del "%%i" ) ) endlocal exit /b :date_diff rem 計(jì)算日期差異的函數(shù) setlocal set "date1=%~1" set "date2=%~2" set "unit=%~3" set "diff=" rem 將日期轉(zhuǎn)換為秒數(shù) for /f "tokens=1-3 delims=-" %%a in ("%date1%") do ( set /a "date1_sec=(((%%c*12)+1)*100+%%a)*100+%%b" ) for /f "tokens=1-3 delims=-" %%a in ("%date2%") do ( set /a "date2_sec=(((%%c*12)+1)*100+%%a)*100+%%b" ) rem 計(jì)算日期差異 set /a "diff_sec=date1_sec-date2_sec" if "%unit%"=="days" ( set /a "diff=diff_sec/86400" ) endlocal & set "%4=%diff%" & exit /b
關(guān)于forfiles和for的詳細(xì)信息,可以在Windows的幫助與支持中找到。
相關(guān)文章
批處理入門手冊(cè)之批處理常用DOS命令篇(echo、rem、cd、dir)
這篇文章主要介紹了批處理入門手冊(cè)之批處理常用DOS命令篇,需要的朋友可以參考下2016-11-11批處理寫的 oracle 數(shù)據(jù)庫備份還原工具
由于平時(shí)要進(jìn)行數(shù)據(jù)庫的備份和還原操作,為了提高效率和節(jié)省時(shí)間就有了下面的批處理程序.2009-07-07批處理按要求將字符串分段輸出的實(shí)現(xiàn)代碼
批處理按要求將字符串分段輸出的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2010-10-10批處理實(shí)現(xiàn)文本內(nèi)容橫列變縱列的代碼
批處理實(shí)現(xiàn)文本內(nèi)容橫列變縱列的代碼,需要的朋友可以參考下。2010-10-10color 對(duì)于當(dāng)前會(huì)話,更改命令提示窗口的前景和背景色
color 對(duì)于當(dāng)前會(huì)話,更改命令提示窗口的前景和背景色...2007-09-09