BZ易风

导航

 

基本格式

FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令

@echo off
for %%i in ("%systemroot%"\*.log) do echo %%i
pause

参数

/d   /l   /r   /f

/d

仅为目录,只对目录有效果

如下,只打印了目录名,文件名没打印出来

@echo off
for /d %%i in (*.*) do echo %%i  ::*或*.*都一样 没什么不同
pause

 

如果不加参数 /d,只打印了文件名字,目录名没打印出来:

@echo off
for %%i in (*) do echo %%i
pause

配合匹配字符使用:

@echo off
for /d %%i in (???) do echo %%i  ::打印只有三个字符的目录,一个?匹配1个字符
pause

 

由此可见,一个中文也代表一个字符。

/R

递归

系统帮助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command

for /r 【指定路径】%%赋予变量 in (指定文件) do 处理语句

有指定路径

@echo off
for /r c:\ %%i in (*.log) do echo %%i
pause

会对整个c盘进行搜索,把c盘内所有的.log文件的绝对路径打印出来

无指定路径

@echo off
for /r  %%i in (*.log) do echo %%i  ::在当前文件夹的路径下搜索
pause 

把当前文件夹及子文件夹下的所有.log文件绝对路径打印出来

/L

迭代数值范围

使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是:

系统帮助的格式:for /L %% Variable in (Start#,Step#,End#) do Command

Start# 初始值

Step# 步长

End# 结束值

@echo off
for /l  %%i in (1,2,5) do echo %%i
pause

 

 

Command后跟的是处理方法,不一定只是打印,如:

@echo off
for /l  %%i in (1,1,5) do start cmd
pause

 

 

可以看出加上执行的那个窗口,一共打开了6个窗口

/f

迭代及文件解析

使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种 ParsingKeywords 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。
文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。

系统帮助的格式:
for /F "ParsingKeywords" %% Variable in (FileNameSet) do Command

ParsingKeywords参数

eol=c     指一个行注释字符的结尾(就一个) 即:忽略掉以c开头的行
skip=n   指在文件开始时忽略的行数。
delims=xxx  指分隔符集。这个替换了空格和跳格键的默认分隔符集。即:以xxx做为分隔符号
tokens=x,y,m-n   指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq   指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。

例:

当前文件夹下创建test.txt文档

;郁闷啊!
您好! 欢迎来到, BZ易风
我们的网站 www.cnblogs.com
完毕!

bat

@echo off
for /f "eol=; tokens=1 delims= " %%i in (test.txt) do @echo %%i  ::使用/f的时候有默认参数 eol=;即使不加也不会打印第一行 默认参数2:delims=空格 如果不加 也只打印每行空格前的字符
pause

结果

解释:这个命令会读取在当前目录下名为test.txt文件中的内容,然后将每一行的内容赋值给变量%%i,然后忽略掉以;号开头的行,并且以空格做为分隔符号,打印第每行以空各做分隔符号的tokens控制的第一列

想要把全部文件内容直接打印出来就可以这样:

@echo off
for /f "delims="   %%i in (test.txt) do @echo %%i  ::默认参数生效 eol=;第一行被忽略
pause

默认参数2:

@echo off
for /f   %%i in (test.txt) do @echo %%i  ::默认参数 delims=空格,即使不写 也只打印空格前的字符 
pause

打印输出命令

 tokens参数来指定打印几列,如果要打印全部列直接把tokens=*就可以了

@echo off
for /f  "tokens=* delims=\t" %%i in ('net user') do @echo %%i
pause

tokens参数指定多列用","隔开

@echo off
for /f  "tokens=1,2 delims= " %%i in ('net user') do @echo %%i  %%j  ::如果需要打印两列,那么打印的时候要多给个变量 %%i第一列, %%j第二列
pause

 tokens参数指定连续多列用"-"链接

@echo off
for /f  "tokens=1-3 delims= " %%i in ('net user') do @echo %%i  %%j %%k  ::指定范围内几列就给几个变量接收打印出来
pause

注意:指定范围或者列数,后面变量要给连续字母 如i,j,k 不能用i,j,m

posted on 2022-06-15 09:40  BZ易风  阅读(1373)  评论(0编辑  收藏  举报