前言
在我们工作中,如果使用Windows系统,善用批处理命令,特别是在批量的文件处理,文本处理时能帮助我们极大地提升工作效率,起到事半功倍的效果!
但很多同学,对批处理的使用更多还停留在可以将多个command命令组合到一起执行,省去重复敲命令和等待的时间。这个其实只是批处理脚本最基本的使用方法
但要充分发挥批处理的作用,批处理脚本中的 for
命令其实才是核心,它作为一个兼顾循环处理,和文本列处理的命令工具,在提升批处理脚本效率方面,无出其右!
但 for 命令的使用,相对比较复杂,很多同学可能并未很好掌握,所以本文,我们带来关于批处理中这个核心命令的系统介绍
文中还有一个秋草发现的彩蛋,微软竟然有一个官方陈年Bug一直没有修 😂😂😂
For 命令介绍
下面我们就来详细介绍这个 windows 批处理中的重磅命令
基础语法
|
|
- %variable: for循环变量,批处理脚本中需用
%%
,命令行直接执行用%
- (set): 可以是文件、目录、字符串或命令输出。。
- command: 指定对每组循环执行的命令。
- command-parameters: 控制循环行为(如
/R
,/D
,/L
,/F
等)
如遍历集合:
|
|
输出:
|
|
- 说明:默认按空格分隔元素,带引号的字符串视为整体。
** /R
参数:递归遍历文件**
这个参数,用于递归遍历目录及其子目录中的文件。
|
|
功能:
- 遍历
C:\Chengxiaqiucao
及其子目录下的所有.txt
文件。 %%a
会包含完整文件路径(如C:\Chengxiaqiucao\test\file.txt
)。
/D
:处理目录
这个参数会仅遍历目录(不处理文件)。
|
|
功能:
- 列出
C:\
下的所有一级目录(如Program Files
,Users
等)。
4. /L
:生成数字序列
这个参数和我们编程时控制循环次数比较类似。
语法:for /L %%a in (起始, 步长, 结束)
如下例生成等差数列:
|
|
输出:
|
|
/F
:高级文本解析(核心参数)
这个参数可以说是 For 命令最核心的参数,For命令大展身手,大部分情况下都是这个参数的功劳。
这个参数主要用于逐行解析文本、字符串或命令输出,并支持复杂规则。
语法:
|
|
- 数据源:文件、字符串或命令输出(用反引号
`
包裹)。 - 选项:
delims
,tokens
,skip
,eol
,usebackq
等。
/F
的常用选项
选项 | 作用 | 示例 |
---|---|---|
delims=xyz |
定义分隔符(默认空格/制表符) | delims=, 按逗号分割 |
tokens=n |
提取第n列(多列用逗号分隔,如 1,3 ) |
tokens=2 提取第二列 |
skip=n |
跳过前n行 | skip=2 跳过前两行 |
eol=; |
定义行注释符(默认 ; ) |
eol=# 忽略以 # 开头的行 |
usebackq |
改变数据源引用方式(见下文) | 处理带空格路径或命令输出 |
usebackq
的作用
此处有彩蛋:官方文档中的Bug
在windows的中文官方帮助中,对 -F
参数的说明,其实是错误的
可以看到,这里对使用 usebackq
的介绍和不使用该参数完全一样,而且,这里中文翻译的非常拗口,很难理解什么意思
不过,我们通过 chcp 65001
命令将命令行代码页切换至utf8,这时查看帮助会显示英文帮助
可以看到,理解起来就清晰多了, usebackq
解决以下场景的问题:
- 处理带空格的文件路径:用双引号引用文件名。
- 执行命令并解析输出:用反引号
`
引用系统命令。 - 直接解析字符串:用单引号
'
引用字符串。
案例一:
|
|
- 若不使用
usebackq
,路径中的空格会导致解析错误。
** 案例二**
解析 data.csv
(格式:姓名,年龄,城市
),跳过标题行,提取姓名和城市。
输入文件 data.csv
:
|
|
批处理:
|
|
输出:
|
|
应用场景总结
参数 | 适用场景 | 典型命令示例 |
---|---|---|
无参数 | 遍历简单文件或字符串列表 | for %%a in (*.txt) do echo %%a |
/R |
递归处理目录下的文件 | for /R %%a in (*.log) do del %%a |
/D |
仅处理目录 | for /D %%a in (C:\*) do echo %%a |
/L |
生成数字序列(如循环固定次数) | for /L %%a in (1,1,5) do echo %%a |
/F |
解析文本文件、命令输出或复杂字符串 | for /F "tokens=2" %%a in (data.txt) |
所以通过掌握For命令的这些参数和技巧,完全可以让它成为批处理脚本中处理文件、文本和系统任务的“瑞士军刀”。