1 循环命令 for的基础语法
- 面向过程语言的基本定义
- 在这里for 不是一个 block ,而也只是1个语句
- 所以for 表示条件符合时,执行这一条语句多次
- 基础语法:
- 在cmd窗口中: for %var in (set) do command
- 在批处理文件中: for %%var in (set) do command
- set是元素结合,可以包含多个元素
- 每个元素之间,用空格键、跳格键、逗号、分号或等号分隔
- 如1.txt,如*.bat,如 a,b,c,d,如 (c: d: e: f:) 如 dir *.* 但是如 abcd 只被认为是一个元素
- %%var ,只能是1个字母,默认会区分大小写!!!也就是只能是小写或大写字母,最多52种可能性
- 会往下顺延,如果循环体是 %%i ,另外几个参数就是 %%j %%k,如果是%%a 后面会延%%b %%c
可能出错的地方
- 循环体变量不能用%var%写法,for C:\Users\pc\bat %%c in (*.bat) do echo %c% 这个错误在 %c%
- 虽然 for 循环的其他地方也可以用 %var%
- 注意在shell里写 %var
- 在bat脚本里写 %%var
- for %%c in (001.txt) do echo %%c, in () do 这些中间的空格不可少
- for in do 几个关键字不可省略
- () 不可省
测试例子
@echo off
echo next step
for %%c in (*.bat) do echo %%c
for 的 开关参数
- for c:\\ %%i in (set) do command
- for /l %%i in (1,1,10) do command
- for /d %%i in (set) do command 只在目录里查
- for /r %%i in (set) do command 会在目录和子目录里查找
- for /f "skip=4 eol=; tokens=2,3* delims=, " %i in (1.txt) do command
- skip 跳过前面几行
- eol 忽略开头为这个的
- tokens 列属性,第几列
- delims 分隔符,可以多个直接写一起,如果是空格,需要delims放最后
测试例子 各种同
for %%i in (*.txt) do find "abc" %%i
对当前目录里所有的txt文件执行 find 命令
for /r . %%i in (*.txt) do find "abc" %%i
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
for /l %%i in (2,1,8) do echo %%i
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
测试例子 for /f
for /f %%i in (.) do echo %%i
for /f %%i in (*.*) do echo %%i
完全不一样
for /f %%i in ('set') do echo %%i 对 set 命令的输出结果循环调用,每行一个
for /f "eol=P" %%i in ('set') do echo %%i 取 set 命令的输出结果,忽略以 P 开头的那几行
for /f "delims=" %%i in (d:mp3.txt) do echo %%i 显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
对 dir 命令的结果,跳过前面5行,余下的每行取第4列,每列之间的分隔符为默认的"空格", "delims=," 是2个分隔符
可以注意到 dir 命令输出的前5行是没有文件名的
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
echo %%a
echo %%b
echo %%c
)
对 date /t 的输出结果,每行取1、2、3列
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
取第2列给 %%a ,其后的列都给 %%b