for基本用法
- cmd窗口: for %i in (command1) do command2
- 批处理中: for %%i in (command1) do command2
基本要素:
- or、in和do是for语句的关键字,它们三个缺一不可;
- %%I是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;
- in之后,do之前的括号不能省略;
- command1和command2表示字符串、变量或命令语句;
- command1之间的元素需要用空格键, tab键, 逗号, 分号, 或等号分割;
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31for %%i in (bbs.bathome.cn) do (
echo %%i
)
for %%i in (bbs,bathome,cn) do (
echo %%i
)
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
echo ====列出所有文件====
for %%i in (*.*) do (
echo "%%i"
)
echo ====列出txt类型的文件====
for %%i in (*.txt) do (
echo "%%i"
)
echo ====列出文件名只有3个字符的bat文件====
for %%i in (???.bat) do (
echo "%%i"
)
echo ====循环建立三个空文件====
for %%i in (1,2,3) do (
type nul>test%%i.txt
)
文本解析: for /f
基本用法
例子:1
2
3
4
5rem 每次读取文本的一行数据
for /f %%i in (test1.txt) do (
echo ===========
echo %%i
)
切分字符串: delims=
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19echo -----------------------------------------
:: 如果没有用delims, 默认会以空格或者tab键为分割符
for /f %%i in (test1.txt) do (
echo ===========
echo %%i
)
echo -----------------------------------------
:: 这里以逗号为分割符
for /f "delims=," %%i in (test1.txt) do (
echo ===========
echo %%i
)
echo -----------------------------------------
:: 这里以点号和逗号为分割符, 截取前面的内容
for /f "delims=.," %%i in (test1.txt) do (
echo ===========
echo %%i
)
定点提取: tokens=
辅助delims, 用于提取具体的一段
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21:: 默认是以空格为分割符
for /f "tokens=1-3" %%i in (test2.txt) do (
echo %%i
echo %%j
echo %%k
)
echo -----------------------------------------------
for /f "delims=, tokens=2-5" %%i in (test3.txt) do (
echo %%i
echo %%j
echo %%k
echo %%l
)
echo -----------------------------------------------
for /f "delims=, tokens=2,3-5" %%i in (test3.txt) do (
echo %%i
echo %%j
echo %%k
echo %%l
)
跳过无关内容, 直奔主题: skip=n
跳过n行, 从n+1行开始
例子:1
for /f "skip=2" %%i in (test3.txt) do echo %%i
忽略以指定字符打头的行: eol=
例子:1
2
3
4
5
6
7echo -----------------------------------------------
:: 忽略以;开头的行
for /f "eol=;" %%i in (test4.txt) do echo %%i
echo -----------------------------------------------
:: eol后面只能指定一个字符
for /f "eol=," %%i in (test4.txt) do echo %%i
使用哪种格式?
- for /f %%i in (文件名) do (…)
- for /f %%i in (‘命令语句’) do (…)
- for /f %%i in (“字符串”) do (…)
- for /f “usebackq” %%i in (“文件名”) do (……)
- for /f “usebackq” %%i in (
命令语句
) do (……) - for /f “usebackq” %%i in (‘字符串’) do (……)
例子:1
2
3echo -----------------------------------------------
:: 先找到文件,在逐个输出
for /f %%i in ('dir /a-d /b test*.txt') do echo %%i
当路径中包含特殊字符时,需要使用usebackq, 它是一个增强型参数, 使用后, command1需要变动如下:
- 如果第一个括号里的对象是一条命令语句的话,原来的单引号’要改为后引号 `
- 如果第一个括号里的对象是字符串的话,原来的双引号”要改为单引号’
- 如果第一个括号里的对象是文件名的话,要用双引号”括起来
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21@echo off
echo ------------------------------------------------
:: 找不到文件
for /f %%i in (test .txt) do echo %%i
:: 当成字符串处理
for /f %%i in ("test .txt") do echo %%i
:: 错误
for /f %%i in ('test .txt') do echo %%i
:: 找不到文件
for /f %%i in (`test .txt`) do echo %%i
echo ------------------------------------------------
:: for /f "delims==" %%i in ('set') do echo %%i
echo ------------------------------------------------
:: 使用usebakq时候需要将(command1)的单引号改为 反引号 `(1旁边的)
:: for /f "usebackq delims==" %%i in (`set`) do echo %%i
echo ------------------------------------------------
for /f "usebackq" %%i in ("test .txt") do echo %%i
pause