一、基本格式
格式:FOR %%variable IN (set) DO command [command-parameters]
说明:
%%variable 指定一个单一字母表示可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
参数:
/d /l /r /f
注意:
IN (set) , "in" 和 "(set)" 之间有空格
在 bat文件中, 使用 %%variable,
在 MS-DOS中, 使用 %variable
二, 参数 /d
概念:主要用于目录搜索,不会搜索文件
只能显示当前目录下的目录名字.
格式:
FOR /D %%variable IN (set) DO command [command-parameters]
如果集(set)中包含通配符,则指定与目录名匹配,而不与文件名匹配。
如果 Set (也就是我上面写的 " 相关文件或命令") 包含通配符(* 和 ? ),
将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command 。
举例:
1, 搜索目录
3.bat => 显示匹配 c:\*的目录
@echo off
for /d %%i in (c:\*) do echo %%i
pause
2, 打印 当前目录下 名字只有1-3个字母的目录
4.bat =>
@echo off
for /d %%i in (???) do echo %%i
pause
说明:
* 号表示任意 N 个字符 ,
?号只表示任意一个字符
3, 打印 当前目录下 window? 的目录
5.bat =>
@echo off
rem 当前目录, 然后切换到 c:\ 目录
pushd c:\
for /d %%i in (windows?) do echo %%i
rem 切换到栈顶目录
popd
pause
三, 参数 /R
格式:FOR /R [[drive:]path] %%variable IN (set) DO command [c ommand-parameters]
[[drive:]path] : 搜索 以指定目录为跟的目录树; 如果没有指定则使用当前目录的目录树.
说明:
/D, 只能显示当前目录下的目录名字.
/R, 能把 指定目录 下的文件名取出来.
注意:
1, set 中包含通配符(?或者*)的文件名
列举出所有真实存在的文件的绝对路径
2, set 中不包含通配符,而是具体的文件名
将所有目录及其子目录 与 指定文件名 拼接,然后列出
举例:
1, 6.bat => 列举 d:\cmd下所有.txt文件 (绝对路径)
@echo off
rem for /r d:\cmd %%i in (*.txt) do echo %%i
for /r d:\cmd %%i in (*.txt) do if exist %%i echo %%i
pause
2, 7.bat =>
@echo off
for /r d:\cmd %%i in (1.txt) do echo %%i
echo ====================================
for /r d:\cmd %%i in (1.txt) do if exist %%i echo %%i
pause
结果:
d:\cmd\1.txt // 不存在
d:\cmd\01\1.txt // 不存在
d:\cmd\01\autorun\1.txt // 不存在
d:\cmd\02\1.txt // 存在
d:\cmd\03\1.txt // 不存在
=========================
d:\cmd\02\1.txt // 存在
请按任意键继续. . .
四, 参数 /L
概念:该集表示以增量形式从开始到结束的一个数字序列。
作用:
重复执行某个命令
格式:
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
举例:
8.bat =>
@echo off
for /L %%i in (1, 1, 5) do echo %%i
pause
结果:
1
2
3
4
5
请按任意键继续. . .
五, 参数 /F
概念:迭代 及 文件解析.
格式:
FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %%variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %%variable IN (`command`) DO command [command-parameters]
说明:
fileset 为一个或多个文件名。
继续到 fileset 中的下一个文件之前,每份文件都被打开、读取并经过处理。
处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。
然后用已找到的符号字符串变量值调用 For 循环。
以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
您可通过指定可选 "options" 参数替代默认解析操作。
这个带引号的字符串包括一个或多个指定不同解析选项的关键字。
这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单
引号字符为文字字符串命令并允许在 file-set
中使用双引号扩起文件名称。
范例:
1, FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
会分析 myfile.txt 中的每一行.
"eol=;" : 忽略以分号打头的那些行.
"delims=, " : 每一行可以有多个符号, 符号之间用 逗号以及空格隔开.
符号: 默认以逗号隔开每一行的符号.
"tokens=2,3*" : 将每行中的第二个和第三个符号传递给 for 函数体.
此 for 函数体的语句引用:
1) %i 来获得第二个符号
2) %j 来获得第三个符号
3) %k 来获得后面的所有剩余符号
myfile.txt : 对于带有空格的文件名,您需要用双引号将文件名括起来。
为了用这种方式来使用双引号,还需要使用 usebackq 选项,
否则,双引号会被理解成是用作定义某个要分析的字符串的。
%i,%j,%k : %i 在 for 语句中显式声明,
%j 和 %k 是通过tokens= 选项隐式声明的。
i,j,k 是顺序的.
可以通过 tokens= 一行指定最多 26 个符号,
只要不试图声明一个高于字母 "z" 或"Z" 的变量。
请记住,FOR 变量是单一字母、分大小写和全局的变量,
而且,不能同时使用超过 52 个。
测试:
myfile.txt=>
1A 1B 1C 1D 1E 1F 1G 1H
2A 2B 2C 2D 2E 2F 2G 2H
3A 3B 3C 3D 3E 3F 3G 3H
d:\cmd\02>for /f "tokens=2,3*" %i in (myfile.txt) do @echo %i %j %k
1B 1C 1D 1E 1F 1G 1H
2B 2C 2D 2E 2F 2G 2H
3B 3C 3D 3E 3F 3G 3H
注意: 将 %k 换成其他字符 会显示不出来剩下的.
2, FOR /F ["options"] %%variable IN ("string") DO command [command-parameters]
说明:
用单(双)引号将括号之间的 file-set 括起来。
这样,该字符串会被当作一个文件中的一个单一输入行进行解析。
举例:
d:\cmd\02>for /f "tokens=1,2,*" %i in ("1B 1C 1D 1E 1F") do @echo %i %j %k
1B 1C 1D 1E 1F
3, FOR /F ["options"] %%variable IN (`command`) DO command [command-parameters]
说明:
用 FOR /F 命令来分析命令的输出。
将括号之间的 file-set 变成一个反括字符串。
该字符串会被当作命令行,传递到一个子 CMD.EXE,
其输出会被捕获到内存中,并被当作文件分析。
举例:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
以"="作为分隔符,会枚举当前环境中的环境变量名称。
@echo off & for /f "usebackq delims== tokens=1,2" %i in (`set`) do if /i %i==path echo %j
打印出 path 环境变量的值, 类似于:
set | find /i "path"
FOR /F "usebackq delims=" %i IN (`net user`) DO @echo %i
FOR /F "delims=" %i IN ('net user') DO @echo %i