【BAT】for命令用法
【BAT】for命令用法
文章目录
前言
- 对一组文件中的每个文件运行指定的命令。
- 可以在批处理程序中或直接从命令提示符使用 for 命令。
for命令一般用法如下:
- 普通用法
for [%%|%]variable in(set) do command [command-parameters]
在批处理程序中使用 for 命令时,指定变量请使用 %%variable而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I
- 只限于目录
for /d [%% | %]variable in (set) do command [command-parameters]
如果 set 包含通配符(* 和 ?),则指定与目录名匹配,而不是文件名。
- 递归
for /r [[drive :]path] [%% | %]variable in (set) do command [command-parameters]
进入根目录树[drive:]path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则假定为当前目录。如果 set 只是一个句号 (.) 字符,则只列举目录树。
- 迭代
for /l [%% | %]variable in (start,step,end) do command [command-parameters]
集合是一系列按步长量划分的、从头到尾的数字。这样,(1,1,5) 将生成序列 1 2 3 4 5,而 (5,-1,1) 将生成序列 (5 4 3 2 1)。
- 文件处理
for /f [<parsingkeywords>] [%%|%]variable in (set) do command [command-parameters]]
提取文本信息,则是for /f的拿手好戏:读取文件内容;提取某几行字符;截取某个字符片段;对提取到的内容再切分、打乱、杂糅……只要你所能想到的花样,for /f 都会想方设法帮你办到,因为,for /f 就是被设计成专门用于解析文本的
一、for循环普通用法
1.1、介绍
for %%variable in (set) do command [command-parameters]
注意点:
for
、in
和do
是for语句的关键字,它们三个缺一不可set
是任何序列,可以只有一个元素。元素可以是变量、字符串,元素之间用空格键、tab键、逗号、分号或等号分隔set
必须用()包围,即使只有一个元素%%variable
是形式变量,即使没有在command
中被使用,也不能省略- 为了不与批处理中的
%0~%9
这10个形式变量发生冲突,请不要随意把%%variable
替换为%%0~%%9
中的任意一个 - for语句依次提取
(set)
中的每一个元素,把它的值赋予形式变量variable
,带到do
后的command
中参与命令的执行;当执行完一次do
后的语句之后,再提取(set)
中的下一个元素,再执行一次command
,如此循环,直到(set)
中的所有元素都已经被提取完毕,该for
语句才宣告执行结束
1.2、用法
@echo off
for %%i in (1, 2, 3) do echo %%i
pause
执行结果:
二、for /d 用法
for /d用于搜索目录或文件夹(不搜索文件),而且只搜索指定目录,不搜索子目录
搜索C:\Users\dell\Desktop\batTest
下的所有文件夹:
@echo off
for /d %%i in (C:\Users\dell\Desktop\batTest\*) do echo %%i
pause
执行之前:
执行结果:
三、for /r 用法
for /r主要用于搜索指定路径及其所有子目录中符合要求的文件(/r后如果没有指定目录,则使用当前目录)
将C:\Users\dell\Desktop\batTest
下的*.txt文件修改后缀名为.doc文件
@echo off
for /r %%i in (*.txt) do ren "%%i" "%%~ni.doc"
pause
执行之前:
执行结果:
四、for /l 用法
for /l %variable in (start,step,end) do command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
@echo off
for /l %%i in (5, -1, 1) do echo %%i
pause
执行结果:
五、for /f 用法
5.1、介绍
for /f 这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果
命令格式:
(1).FOR /F [“options”] %%i IN (file) DO command
(2).FOR /F [“options”] %%i IN (“string”) DO command–注意双引号
(3).FOR /F [“options”] %%i IN (‘command’) DO command–注意单引号
/f
表示读取文件file内容,以行为单位赋给%%i
- 默认情况下,每行以空格键作为分隔符分割为第1节、第2节。。。默认只读取第1节赋值给
%%i
- 默认情况下,忽略以分号;打头的行
5.2、for /f %%i in (file) do command
file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行为一个元素,忽略空白的行。
假如文件C:\Users\dell\Desktop\batTest\test.txt中有如下内容:
使用命令遍历文件中的内容:
@echo off
for /f %%i in (C:\Users\dell\Desktop\batTest\test.txt) do echo %%i
pause
for会先打开
test.txt
,然后读出test.txt
里面的所有内容,把它作为一个集合,并且以每一行(文件中无分隔符情况下)作为一个元素,用%%i依次代替每个元素,然后执行do后面的命令。
执行结果为:
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777
请按任意键继续. . .
如果遇到有分隔符的情况的话,就无法将所有的内容显示出来,因为命令默认是以空格和TAB为分隔符,所以它遇到分隔符之后,默认只取第一个,就将分隔符后面的都丢掉了。
例如test.txt内容变为:
执行结果为:
111111
222222
333333
444444
555555
666666
777777
请按任意键继续. . .
5.2.1、delims和tokens
如果我们还想把每一行再分解更小的内容,该怎么办呢?for命令提供了更多的参数,它们就是:delims和tokens
delims :告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键
for /f "delims= " %%i in (C:\Users\dell\Desktop\batTest\test.txt) do echo %%i
for /f %%i in (C:\Users\dell\Desktop\batTest\test.txt) do echo %%i
这两行效果是一样的
如果我们想要每一行的后面的元素,那又如何呢?这个时候就可以利用tokens参数,它的作用就是当你通过delims将每一行分为更小的元素时,由tokens来控制要取哪一个或哪几个。
显示第二列,示例如下:
@echo off
for /f "tokens=2 delims= " %%i in (C:\Users\dell\Desktop\batTest\test.txt) do echo %%i
pause
如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,全部显示则使用通配符tokens=*。
注意:如果显示多个元素(非*),比如这里的tokens=2-3,语句应该写成这样:
for /f "tokens=2,3 delims= " %%i in (C:\Users\dell\Desktop\batTest\test.txt) do echo %%i %%j
怎么多出一个%%j
?
这是因为你的tokens
后面要取每一行的两列,用%%i
来替换第二列,用%%j
来替换第三列。
并且必须是按照英文字母顺序排列的,%%j
不能换成%%k
,因为i
后面是j
。
显示从第二列到最后的一列,命令如下:
@echo off
for /f "tokens=2,* delims= " %%i in (C:\Users\dell\Desktop\batTest\test.txt) do echo %%i %%j
pause
5.2.2、skip,eol和usebackq
-
skip
表示跳过第1到第n行,从n+1行开始读取,默认n=0,就是告诉for忽略前n行
示例如下:@echo off for /f "skip=6 tokens=1,2 delims= " %%i in (C:\Users\dell\Desktop\batTest\test.txt) do echo %%i %%j pause
-
eol
用来指定当一行以什么符号开始时,就忽略它
示例如下:@echo off for /f "eol=# tokens=1,2 delims= " %%i in (C:\Users\dell\Desktop\batTest\test.txt) do echo %%i %%j pause
-
usebackq
usebackq 是一个增强型参数,当使用了这个参数之后,原来的for语句中第一个括号内的写法要做如下变动:如果第一个括号里的对象是一条命令语句的话,原来的单引号 ’ 要改为后引号 ` ;如果第一个括号里的对象是字符串的话,原来的双引号 " 要改为单引号 ’ ;如果第一个括号里的对象是文件名的话,要用双引号 " 括起来。
(1)命令语句示例如下:@echo off for /f usebackq %%i in (`set`) do echo %%i pause
(2)文件名示例如下:
@echo off for /f usebackq %%i in ("C:\Users\dell\Desktop\batTest\test.txt") do echo %%i pause
(3)字符串示例如下:
@echo off for /f usebackq %%i in ('hello world') do echo %%i pause
5.3、for /f %%i in (“string”) do command
示例:
@echo off
for /f "tokens=2,* delims= " %%i in ("this is an example!") do echo %%i %%j
pause
执行结果:
is an example!
请按任意键继续. . .
对于字符串的处理类似于文件的处理,此处不再赘述。
5.4、for /f %%i in (‘command’) do command
该命令将command的执行结果作为集合,示例:
@echo off
for /f "tokens=2,* delims==" %%i in ('set') do echo %%i
pause
执行结果,部分展示:
C:\ProgramData
C:\Program Files
C:\Program Files (x86)
C:\Program Files
$P$G
C:\Program Files\WindowsPowerShell\Modules;C:\windows\system32\WindowsPowerShell\v1.0\Modules
C:\Users\Public
C:\Users\dell\AppData\Local\Programs\Python\Python310
win32-msvc2015
D:\Qt5.12.0\5.12.0\msvc2017_64\lib\cmake\Qt5
D:\VS2019Working\qt-everywhere-opensource-src-4.8.7
C:\Users\dell\AppData\Local\QtMsBuild
其他操作类似于文件的处理,此处不再赘述。
六、路径扩充
变量%i的扩充 | 作用 |
---|---|
%~i | 删除任何引号",扩展 %i |
%~fi | 将 %I 扩展到一个完全合格的路径名 |
%~di | 仅将 %i 扩展到一个驱动器号 |
%~pi | 仅将 %i 扩展到一个路径 |
%~ni | 仅将 %i 扩展到一个文件名 |
%~xi | 仅将 %i 扩展到一个文件扩展名 |
%~si | 扩展的路径只含有短名 |
%~ai | 将 %i 扩展到文件的文件属性 |
%~ti | 将 %i 扩展到文件的日期/时间 |
%~zi | 将 %i 扩展到文件的大小 |
%~$PATH:i | 查找列在路径环境变量的目录,并将 %i 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串 |
还有组合增强语法:
变量%i的扩充 | 作用 |
---|---|
%~dpi | 仅将 %i 扩展到一个驱动器号和路径 |
%~nxi | 仅将 %i 扩展到一个文件名和扩展名 |
%~fsi | 仅将 %i 扩展到一个带有短名的完整路径名 |
%~dpi | 仅将 %i 扩展到一个驱动器号和路径 |
%~dp$PATH:i | 搜索列在路径环境变量的目录,并将 %i 扩展到找到的第一个驱动器号和路径 |
%~ftzai | 将 %i 扩展到类似输出线路的 DIR |
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)