forfiles
是一个强大的Windows命令行工具,用于遍历目录结构中的文件,并对符合条件的文件执行命令。它特别适合用于批处理文件、系统维护脚本和自动化任务中,例如文件清理、权限更改或文件移动等操作。
forfiles
命令的基本语法:
FORFILES [/P path] [/M mask] [/S] [/D {+|-}date] [/C command]
参数解释:
/P path
:指定开始搜索的根目录路径。如果省略,则默认为当前目录。/M mask
:指定要搜索的文件名掩码(通配符)。例如,*.txt
将匹配所有.txt
文件。/S
:指示forfiles
遍历子目录,查找匹配的文件。/D {+|-}date
:根据文件的最后修改日期筛选文件。+
或-
后跟日期(格式为yyyy/MM/dd
或dd
)表示文件最后修改日期比给定日期更晚或更早。/C command
:指定要对找到的每个文件执行的命令。命令中可以使用特殊参数 @file、@path、@fsize 等来引用文件名、完整路径、文件大小。
举例说明:
假设我们想要删除当前目录及其子目录中所有最后修改日期超过30天的 .log
文件。
删除旧的日志文件:
forfiles /P %CD% /M *.log /S /D -30 /C "cmd /c del @path"
在这个例子中:
%CD%
是当前目录。*.log
匹配所有.log
文件。/S
表示搜索当前目录及其所有子目录。/D -30
表示只考虑最后修改日期在30天之前的文件。/C "cmd /c del @path"
表示使用del
命令删除文件,其中@path
是forfiles
提供的参数,代表当前处理的文件的完整路径。
更改文件权限:
如果你想更改当前目录及其子目录下所有 .docx
文件的权限,使其可读但不可写,可以使用以下命令:
forfiles /P %CD% /M *.docx /S /C "cmd /c icacls @path /inheritance:r /grant administrators:(R) /t"
在这个例子中,icacls
命令被用来更改文件权限。
复制文件到另一个目录:
假设我们要将当前目录下的所有 .jpg
文件复制到 D:\MyPhotos
目录:
forfiles /P %CD% /M *.jpg /C "cmd /c copy @path d:\MyPhotos"
请注意,在实际使用中,可能需要创建 D:\MyPhotos
目录,如果它还不存在的话。
forfiles
命令的 /C
参数中,你可以使用一些特殊的替换参数来引用文件的各种属性。以下是一些常用的替换参数及其含义:
变量 | 描述 |
@file | 返回匹配项的名称,双引号。 |
@fname | 返回匹配项的基名(没有文件扩展名),双引号。 |
@ext | 返回文件扩展名,双引号,没有前导点。如果文件有多个扩展名,则只返回最后一个。 如果文件没有扩展名,则返回带引号的空字符串。 |
@path | 返回匹配项的完整路径,双引号,包括驱动器号和文件扩展名(如果有)。 |
@relpath | 返回匹配项的相对路径,双引号和相对于起始目录(由/ P给出)。 每个路径以点和反斜杠(.\)开头。 |
@isdir | 如果文件类型是目录,返回 TRUE,否则返回 FALSE。 |
@fsize | 返回用字节表示的文件大小 |
@fdate | 返回文件上次修改的日期,采用当前用户的本地化日期格式。 |
@ftime | 返回文件上次修改时间,采用当前用户的本地化时间格式。 |
这些参数可以被嵌入到 /C
参数指定的命令中,用来动态生成针对每个文件的具体命令。
显示文件名和大小
forfiles /P C:\mydir /M *.txt /C "cmd /c echo 文件名: @file, 大小: @fsize 字节"