forfiles bat批处理 定期删除文件与文件夹

发布于 2019-10-16  435 次阅读


介绍一个bat批处理 定期删除文件与文件夹的命令 forfiles
在我们项目,经常开发出包也许会一天多个包,这样会导致FTP会很容易撑满,虽然会有2T空间,所以定期需要删除一些旧包。所以这个命令就非常好用。
一、FORFILES 的描述以及说明
FORFILES [/P pathname] [/M searchmask] [/S]
         [/C command] [/D [+ | -] {yyyy-MM-dd | dd}]

描述:
    选择一个文件(或一组文件)并在那个文件上执行一个命令。这有助于批处理作业。

参数列表:
    /P    pathname      表示开始搜索的路径。默认文件夹是当前工作的目录 (.)。
    /M    searchmask    根据searchmask指定的搜索通配符来搜索文件。默认搜索掩码是 '*'。
    /S                  指导 forfiles 递归到子目录。像 "DIR /S"。
    /C    command       表示为每个匹配到的对象执行的命令。命令字符串应该用双引号括起来。默认命令是 "cmd /c echo @file"。下列变量可以用在命令字符串中:
                        @file    - 返回文件名(仅文件名)。
                        @fname   - 返回不带扩展名的文件名。
                        @ext     - 只返回文件的扩展名。
                        @path    - 返回文件的完整路径(包含文件名)。
                        @relpath - 返回文件的相对路径。
                        @isdir   - 如果文件类型是目录,返回 "TRUE";如果是文件,返回 "FALSE"。
                        @fsize   - 以字节为单位返回文件大小。
                        @fdate   - 返回文件上一次修改的日期。
                        @ftime   - 返回文件上一次修改的时间。
特别说明:
                        要在命令行包括特殊字符,字符请以 0xHH形式使用十六进制代码(例如,0x09 为 tab)。
                        调用内部 CMD.exe 命令前面应以 "cmd /c" 开始。
                        
    /D    date          通过文件的上次修改日期选择文件,主要有以下两种写法:
{+|-} "yyyy-mm-dd":表示其上一次修改日期大于等于(+),或小于等于(-)指定的日期;
{+|-} dd(范围:0-32768):表示上次修改日期大于等于当前日期加dd指定的天数(+),或小于等于当前日期减指定的天数(-),默认为加号
/?                  显示此帮助消息。

示例:
  

  FORFILES /?
    FORFILES
    FORFILES /P C:\WINDOWS /S /M DNS*.*
    FORFILES /S /M *.txt /C "cmd /c type @file | more"
    FORFILES /P C:\ /S /M *.bat
    FORFILES /D -30 /M *.exe
             /C "cmd /c echo @path 0x09 在 30 前就被更改。"
    FORFILES /D 2001-01-01
             /C "cmd /c echo @fname 在 2001年1月1日就是新的。"
    FORFILES /D +2015-7-4 /C "cmd /c echo @fname 今天是新的。"
    FORFILES /M *.exe /D +1
    FORFILES /S /M *.doc /C "cmd /c echo @fsize"
    FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

二、使用案例
1.在D:\TEST下删除前30天以demo开头的文件夹(非空也强制删除)

forfiles /p D:\TEST /m "demo*" /d -30 /c "cmd /c rmdir /q /s @path"

2.在D:\TEST下删除前30天以demo开头的文件夹(非空也强制删除)以及demo开头的文件

forfiles /p D:\TEST /m "demo*" /d -30  /c "cmd /c if @isdir==TRUE (rmdir /q /s @path) else (del /f @path)"

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。