1.变量引用:
在cmd窗口中:
FOR %variable IN (set) DO command [command-parameters]
在Bat文件中:
FOR %%variable IN (set) DO command [command-parameters]
注:in和do之间的set表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,
每个元素之间,用空格键、跳格键、逗号、分号或等号分隔。
2.带开关的for用法:
(1)含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:
FOR /L %%variable IN (start,step,end) DO command
其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。
例1.创建5个文件夹:
@echo off
for /l %%i in (1,2,10) do md %%i
pause
//将新建5个文件夹,文件夹名称依次为1.3.5.7.9。
例2.1+2+3+...+100求和:
@echo off
set /a sum=0
for /l %%i in (1,1,100) do set /a sum=sum+%%i
echo %sum%
pause
(2)含开关/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等。其命令格式为:
FOR /F ["options"] %%variable IN (set) DO command
其中,set为("string"、'command'、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。一般情况下,使用较多的是skip、tokens、delims三个选项。
skip=n - 从文本开始忽略n行
delims - 指定定界符
tokens -提取列。
通俗讲,共同提取每一行的第m小节的内容。因此,可以用该命令来指定提取文本信息。
tokens= 提取全部。
tokens=m 提取第m列。
tokens=m,n 提取第m列和第n列。
tokens=m-n 提取第m列至第n列。
tokens=* 删除每行前面的空格。忽略行首的所有空格。
tokens=m* 提取第m列以后的所有字符,星号表示剩余的字符。
tokens=m,*
输出变量的个数由定义了的tokens决定。
含开关/F的for语句举例:
@echo off
echo **No Options:
for /f %%a in ("1,2,10") do echo a=%%a
echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c
pause
@echo off
echo 本文件夹里面的文件有:
for /f "skip=5 tokens=3* delims= " %%a in ('dir') do ( rem dir用"''"括起来系统才识别为命令
if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b
)
pause
注:上一个脚本中dir用一对单引号括起来才识别为命令 。
@echo off
echo 本文件夹里面的文件有:
dir > c:\file.txt
for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (
if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b
)
del c:\file.txt
pause
对于后面的两个例子,其中options里面的delims= 是可以删除的,因为只要添加了/F开关系统就将delims的值默认为空格。
符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。本例中也可以改为4,
不过文件名中有空格的文件,只能显示空格以前部分。同时我们也看到了,for语句的do后面的command也是可以分行的,只需要保证command的左括号和do在同一行就可以了。
(3)开关/D或/R
/D只可指定目录,/R参数之后还可带盘符及路径。含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹,故而列举此例。
把f盘下所有.txt结尾文件替换为.bak结尾:
@echo off
path=f:\ rem 指定路径
for /r %path% %%i in (*.txt) do ren %%i *.bak rem 把f盘下所有.txt结尾文件替换为.bak结尾
pause
(4)用法示例:
a.搜索当前目录下所有的文本文件 :
rem 搜索当前目录下所有的文本文件
@echo off
for %%i in (*.txt) do echo "%%i"
pause
b.批量创建学号为1812223001-1812223040.docx文档:
@echo off
for /l %%i in (1,1,9) do type nul > 181222300%%i.docx rem 01-09
for /l %%i in (10,1,40) do type nul > 18122230%%i.docx rem 10-40
pause
c.删除f盘的所有空目录:
dir /a:d查找属性为目录的
/b舍弃标题与摘要内容,即只提取文件名
/s递归遍历子目录
@echo off
path=f:
for /f "delims=" %%i in ('dir /b /s /a:d %path%') do rd %%i
pause
d.批量扫描IP:
@echo off
for /l %%i in (1,1,255) do ping 192.168.0.%%i
pause>nul