浅显易懂的win批处理指令--for指令入门
for的基本用法是:
for 变量 in (目标) do 执行行为
不带参数的for命令
@echo off for %%i in (1 2 3 4 5) do echo %%i pause
输出结果:
注意上面的临时变量%%i中的i,可以换成别的字母,但只能是一位。
带参数 /L 的for
参数/L 可以理解为 "list" 的意思,大小写均可。代表一个数列,下面脚本的意思是: 就是以 1 开始,步长为1 ,结束值为2的一个等差数列
@echo off for /l %%i in (1 1 2) do echo %%i pause
输出结果:
带参数 /F 的for
参数/F可以理解为“file”的意思,代码处理对象为文本串, 常用的参数有skip,tokens,delims,看示例:
@echo off for /f "skip=1 tokens=1,2* delims= " %%a in (test.txt) do echo %%a %%b %%c pause
test.txt的内容如下:
A1 A2 A3+111,222.333-444/555 A4 A5
skip
for循环文本内容是以行为单位,从上至下进行的,skip=1意识就是跳过文本的第一行,即不循环第一行, 那么skip=2 自然就是跳过前两行了,依次类推...
@echo off for /f "skip=1" %%a in (test.txt) do echo %%a %%b %%c pause
delims
delims=后面的字符的意识是,将文本每一行的内容以delims=后面的字符分割成若干列.for默认是以,;和空格作分割符的, 所以一般要取得整行内容通常会用"delims="这样的形式来取消for的默认分割符。如果使用空格,要将空格放到最后
@echo off for /f "tokens=1-3 delims=+./-" %%a in (test.txt) do echo %%a %%b %%c pause
tokens
tokens=1-5,1-5很好理解就1至5,前面我们用delims=后面的字符为分割符,将文本内容分成了多列,需要的是哪些列, 用它指定,默认是1列
@echo off for /f "tokens=1-5 delims=+./-" %%a in (test.txt) do echo %%a %%b %%c %%d %%e pause
代码中前面有个%%a, 这里的%%a就是代表第一列, 第二列就是%%b, 第三列就是%%c 依此类推
那么我们如果把
echo %%a %%b %%c %%d %%e
改为
echo %%e %%d %%c %%b %%a
会如何呢? 会显示
444 333 222 111 A3
若是第一个%%a把它改为%%i也是一样,那么第二列就是%%j...%%k...依此类推,就是按英文字母的顺序依此类推的。
如果用tokens=1,2* 有什么区别呢?
- | 代表从几至几 |
, | 代表单一的,如 tokens=1,5 就是代表第一列和第五列 |
* | 代表剩下的所有的列. 如:tokens=1,2* 代表%%a为第一列, %%b为第二列, %%c代表后面所有的列. |
@echo off for /f "tokens=1,2* delims=+./- " %%a in (test.txt) do echo %%a %%b %%c %%d %%e pause
for /F 不但可以循环文本内容还可以循环字符串,如:
@echo off for /f "tokens=1-3 delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c pause
for的 /D 参数
/D参数(常用来查询当前目录或者指定目录的下的文件夹)
基本用法:for /d %variable in (set) do command [command-parameters]
@echo off for /d %%i in (d:A\*) do echo %%i pause>nul
如果省略 括号中的 "d:A\*",则会直接查询批处理所在目录的文件夹
假设本批处理文件保存在:d:\tt下
运行以下批处理代码,将会 查询 d:\tt下的文件夹
@echo off for /d %%i in (*) do echo %%i pause>nul
For /R参数
基本用法:
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树中,所有符合(set)的文件或者文件夹。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
@echo off for /r d:\tt %%i in (*) do echo %%i pause>nul
枚举d:\tt下所有的 .bat文件(包括子目录)
@echo off for /r d:\tt %%i in (*.bat) do echo %%i pause>nul
如果省略以上代码中的d:\tt,则会列举当前目录 所有符合(set)的文件
如:列举批处理所在目录的所有批处理文件(包括子目录)
@echo off for /r %%i in (*.bat) do echo %%i pause>nul
for遍历文件或目录时,你一定看不懂%%~anx之类的东西,它的含义如下:
@echo off for /r d:\tt %%a in (*) do ( echo a: 文件完整信息 %%a echo ~da: 保留文件所在驱动器信息 %%~da echo ~pa: 保留文件所在路径信息 %%~pa echo ~na: 保留文件名信息 %%~na echo ~xa: 保留文件后缀信息 %%~xa echo ~za: 保留文件大小信息 %%~za echo ~ta: 保留文件修改时间信息 %%~ta echo ~dpa: 保留文件所在驱动器和所在路径信息 %%~dpa echo ~nxa: 保留文件名及后缀信息 %%~nxa echo ~pnxa: 保留文件所在路径及文件名和后缀信息 %%~pnxa echo ~dpna: 保留文件驱动器、路径、文件名信息 %%~dpna echo ~dpnxa: 保留文件驱动器、路径、文件名、后缀信息 %%~dpnxa ) pause>nul
只要记住d-盘符 p-路径 n-文件名 x-文件后缀 t -修改时间 z-文件大小 这些字符分别是代表的是什么意思就可以了,些字符是可以互相任意搭配的。
批处理指令片段
@echo off setlocal set sourcedir=D:\tt set keepDir=.git node_modules rem 删除根目录下的文件夹 for /d %%a in (%sourcedir%\*) do ( set isDel=1 for %%b in (%keepDir%) do ( if %%~nxa == %%b set isDel= ) if defined isDel ( rd /s /q %%a ) ) rem 删除根目录下的文件 for %%a in (%sourcedir%\*) do del %%a
参考文章:
[1] 浅谈批处理for命令中的变量扩展