forfiles命令选择一个或多个文件,并对它们执行另一个命令。 它可以选择文件的标准,包括文件名和修改时间。 它可以在命令行中使用,也可以作为批处理作业的一部分。

FORFILES [/P pathname] [/M searchmask] [/S] [/C command]
         [/D [+ | -]{MM/DD/YYYY | dd}]

/P pathname

开始搜索文件的路径。如果未指定,则使用当前目录(.)。

/M searchmask

搜索名称与搜索掩码searchmask匹配的文件(以及目录,如果指定了/S选项)。

其中可能包含通配符。

默认的搜索掩码是“*”(星号),它匹配所有的文件和目录。

/S

递归到子目录中,如“DIR /S”。

 /C command

在每个文件上执行命令,其中命令是命令字符串,用双引号括起来。


默认命令是“cmd /c echo @file”,它显示文件的名称。


以下变量可以在命令字符串中使用:


@file—返回文件的名称,不包含路径信息。

@fname—返回不带扩展名的文件名。

如果文件有多个扩展名,例如file.txt。

doc,只有后面的扩展名被截断,例如file.txt的结果。

@ext—只返回文件的扩展名。

如果文件有多个扩展名,则只返回后面的扩展名。

@path—返回文件的完整路径,包括文件名。

@relpath—返回文件的相对路径。

@isdir——如果文件类型是目录,则返回TRUE,如果是文件,则返回FALSE。

@fsize—返回文件的大小,以字节为单位。

@fdate—返回文件的最后修改日期。

@ftime—返回文件的最后修改时间。


要在命令行中包含特殊字符,请对0xHH格式的字符使用十六进制代码

(例,对制表符使用0x09)。

所有命令都应该在前面加上“cmd /c”。

尽管如果命令是不需要参数的外部命令,可以省略它。

/D [+ | -]{MM/DD/YYYY | dd}

使用“MM/DD/YYYY”格式选择最后修改日期大于或等于指定日期(+)或小于或

等于指定日期(-)的文件。

也可以选择文件的最后修改日期大于或等于(+)当前日期加上“dd”天,或小于或等于(-)当前日期

减去“dd”天。

有效的“dd”天数可以是0-32768范围内的任何数字。

如果没有指定,则使用“+”作为默认符号。

forfiles 示例

forfiles /d -30

列出当前目录中在过去30天内未被修改的任何文件的名称。

forfiles /d -30 /c "cmd /c echo @path @fdate"

与上面的命令相同,但是显示带有文件名的完整路径,以及文件最后修改的日期。

forfiles /d +"03/15/2018"

列出当前目录中2018年3月15日以后修改的所有文件。

forfiles /d -"03/15/2018"

列出当前目录中2018年3月15日以后未修改的所有文件。

forfiles /m "*.txt" /c "cmd /c notepad @file"

对于当前目录中扩展名为.txt(文本文件)的每个文件,使用记事本打开该文件。

forfiles /m "*.jpg" /c "cmd /c mspaint @file"

对于当前目录中扩展名为.jpg (JPEG文件)的每个文件,使用Microsoft Paint打开该文件。

forfiles /s /p "C:\Users\myuser\Downloads" /m "*.zip" /d -"03/15/2018" /c "cmd /c move @path C:\oldfiles"

对于c:users失败myuser失败下载中的每个.zip (zip文件)或其子目录,如果该文件最后一次修改是在2018年3月15日之前,则将其移动到目录C:\oldfiles。

forfiles /s /p "C:\Users\myuser\backups" /m "*.zip" /d -90 /c "cmd /c del @path"

对于c:users失败myuser失败目录下的每个zip文件或其子目录,如果该文件在过去90天内没有被修改,则删除它。

forfiles /s /p . /m "*.zip" /c "cmd /c move @file @fname"

对于当前目录和所有子目录中的每个文件,删除文件名的扩展名(如果存在)。
如果文件名有多个扩展名,则只删除最后一个。例如,file.bak将被重命名为file, file.doc.bak将被重命名为file.doc。