批处理之for语句

for基本用法

  • cmd窗口: for %i in (command1) do command2
  • 批处理中: for %%i in (command1) do command2

基本要素:

  1. or、in和do是for语句的关键字,它们三个缺一不可;
  2. %%I是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;
  3. in之后,do之前的括号不能省略;
  4. command1和command2表示字符串、变量或命令语句;
  5. 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
31
for %%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
5
rem 每次读取文本的一行数据
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
19
echo -----------------------------------------
:: 如果没有用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
7
echo -----------------------------------------------
:: 忽略以;开头的行
for /f "eol=;" %%i in (test4.txt) do echo %%i

echo -----------------------------------------------
:: eol后面只能指定一个字符
for /f "eol=," %%i in (test4.txt) do echo %%i

使用哪种格式?

  1. for /f %%i in (文件名) do (…)
  2. for /f %%i in (‘命令语句’) do (…)
  3. for /f %%i in (“字符串”) do (…)
  4. for /f “usebackq” %%i in (“文件名”) do (……)
  5. for /f “usebackq” %%i in (命令语句) do (……)
  6. for /f “usebackq” %%i in (‘字符串’) do (……) 

例子:

1
2
3
echo -----------------------------------------------
:: 先找到文件,在逐个输出
for /f %%i in ('dir /a-d /b test*.txt') do echo %%i

当路径中包含特殊字符时,需要使用usebackq, 它是一个增强型参数, 使用后, command1需要变动如下:

  1. 如果第一个括号里的对象是一条命令语句的话,原来的单引号’要改为后引号 `
  2. 如果第一个括号里的对象是字符串的话,原来的双引号”要改为单引号’
  3. 如果第一个括号里的对象是文件名的话,要用双引号”括起来

例子:

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