在 Windows 命令提示符(CMD)或批处理脚本(.bat
文件)中,for
循环支持使用文件模式通配符来遍历文件和目录,以下是具体的使用说明:
基本语法
for %variable in (set) do command [command-parameters]
(在命令提示符中直接使用,变量用单百分号 %
)
for %%variable in (set) do command [command-parameters]
(在批处理脚本中使用,变量用双百分号 %%
)
其中,(set)
部分可以包含通配符,用于指定要处理的文件集合。
常用通配符
1. *
通配符
*
可以匹配任意长度的任意字符(包括空字符)。
- 示例一:列出目录下所有文件
在命令提示符中,输入for %f in (*) do @echo %f
,这会列出当前目录下的所有文件和目录。@echo %f
用于输出每个匹配到的文件名,@
符号的作用是禁止在执行命令时回显命令本身(即不在屏幕上显示echo %f
这行命令 )。 - 示例二:在批处理脚本中列出特定扩展名的文件
在批处理脚本(如test.bat
)中写入以下内容:
@echo off
for %%f in (*.txt) do (
echo 找到文本文件: %%f
)
pause
上述脚本会遍历当前目录下所有扩展名为 .txt
的文件,并输出文件名。
2. ?
通配符
?
只匹配一个任意字符。
- 示例一:查找文件名特定位置字符的文件
假设当前目录下有file1.txt
、file2.txt
、filea.txt
等文件,在命令提示符中输入for %f in (file?.txt) do @echo %f
,会匹配文件名是file
开头,接着是任意一个字符,然后以.txt
结尾的文件,例如会输出file1.txt
、file2.txt
等。 - 示例二:在批处理脚本中处理特定格式文件名
在批处理脚本中,如下代码可以查找文件名中第二个字符固定,其他位置有特定要求的文件:
@echo off
for %%f in (f?le*.txt) do (
echo 匹配到符合格式的文件: %%f
)
pause
遍历子目录
如果要遍历指定目录及其子目录下的文件,可以结合 for /r
命令。
- 示例一:命令提示符中查找所有子目录下的特定文件
在命令提示符中输入for /r C:\test %f in (*.log) do @echo %f
,这会从C:\test
目录开始,递归查找所有子目录下扩展名为.log
的文件,并输出文件的完整路径。 - 示例二:批处理脚本中遍历子目录处理文件
在批处理脚本中,如下代码可以对指定目录及其子目录下的所有.xml
文件进行备份操作(假设备份到backup
目录):
@echo off
set "sourceDir=C:\source"
set "backupDir=C:\backup"
if not exist %backupDir% mkdir %backupDir%
for /r %sourceDir% %%f in (*.xml) do (
set "relativePath=%%~pf"
setlocal enabledelayedexpansion
set "backupPath=%backupDir%!relativePath:%sourceDir%=!"
endlocal
if not exist "!backupPath!" mkdir "!backupPath!"
copy "%%f" "!backupPath!"
)
pause
上述脚本通过 for /r
遍历 C:\source
及其子目录下的 .xml
文件,创建对应的备份目录并进行文件复制。
其他有用的修饰符
1. ~
修饰符
使用 ~
修饰符可以对文件名进行各种处理,例如:
%%~nf
:只获取文件名(不包含扩展名)。%%~xf
:只获取文件的扩展名。%%~dp
:只获取文件的路径(不包含文件名)。
例如,在批处理脚本中,如下代码可以将当前目录下所有文件的文件名和扩展名分别输出:
@echo off
for %%f in (*) do (
echo 文件名: %%~nf
echo 扩展名: %%~xf
)
pause
2. ~n
修饰符(其中 n
为数字)
%%~n$f
可以用于获取文件的短文件名,其中 n
取值范围是 0
到 9
,例如 %%~0f
。在处理文件名中包含空格或特殊字符等情况时,有时需要用到短文件名来避免命令执行错误。
通过合理运用这些通配符和修饰符,for
循环可以灵活地处理文件和目录,满足不同的自动化处理需求。