windows批处理之FOR

FOR

FOR %%variable IN (set) DO command [command-parameters]

  %variable  指定一个单一字母可替换的参数
  (set)      指定一个或一组文件。可以使用通配符。
  command    指定对每个文件执行的命令。
  command-parameters 为特定命令指定参数或命令行开关。

在批处理程序中使用 FOR 命令时:

  • 指定变量请使用 %%variable而不要用 %variable
  • 变量名称是区分大小写的,所以 %i 不同于 %I
  • 循环体内有多条语句时,可以在DO后面用小括号包含,但是 "do (" 必须在一行

1. 基本用法

for %%i in (0,1,10)  do (
 echo %%i
)

依次输出数组 0,1,10(这里用空格隔开与,隔开效果一样)
set list=1,2,3,4,5
for %%i in (%list%) do (
  echo %%i
)

定义数组并输出数组中字符(逗号分割也可以用空格)
for %%i in ("0,1,10")  do (
 echo %%i
)

若是用引号包含,就会直接输出该字符串,且字符串带引号(若是 echo %%~i 就不会带引号)
for %%i in (C:\*.*) do (
  echo %%i
)

遍历c盘下的所有文件,不包括文件夹和文件夹里面的文件,输出绝对路径
for %%i in (C:\*.txt*) do (
  echo %%i
)

遍历c盘下的所有txt文件,输出绝对路径
for %%i in (??.txt) do (
  echo %%i
)

遍历运行路径下的名称长度为2的txt文件,并输出相对路径(调用的是绝对路径就会输出绝对路径)

2. 扩展用法(/D)

只能遍历相对路径下的文件夹(不包括子路径),输出相对路径

for /d %%p in (*) do (
  echo %%p
)

输出所有运行路径下的文件夹的相对路径,不包括子文件夹
for /d %%p in (e*) do (
  echo %%p
)

输出运行路径下的以e开头的文件夹的相对路径,不包括子文件夹(*e 表示以e结尾)

2. 扩展用法(/L)

简单for循环,遍历一个数值集合

for /L %%i in (0,1,10)  do (
 echo %%i
)

该集表示以增量形式从开始到结束的一个数字序列。
(1,1,5)   将产生序列1 2 3 4 5
(1,2,5)   将产生序列1 3 5
(5,-1,1)  将产生序列5 4 3 2 1

3. 扩展用法(/R)

遍历路径下的文件夹和文件(包括子路径),输出绝对路径

for /r %%i in (.) do (
  echo %%i
)

遍历运行路径下的所有文件夹,包括本身和子文件夹(用/和\与.一样的功能),输出绝对路径但是最后会以.结尾
for /r %%i in (*) do (
  echo %%i
)

遍历运行路径下的所有文件,包括子文件夹下的文件,并输出绝对路径
for /r C:\ %%i in (*) do (
  echo %%i
)

遍历对应文件夹下的所有文件,包括子文件夹下的文件,并输出绝对路径
for /r C:\ %%i in (*.txt) do (
  echo %%i
)

遍历对应文件夹下的所有txt文件,包括子文件夹下的文件,并输出绝对路径

4. 扩展用法(/F)

遍历文件中的数据,并按要求输出

for /f %%s in (1.txt) do (
 echo %%s
)

读取运行路径下的1.txt,并显示每一行的内容(每一行内容遇到空格即终止,即只显示每一行第一个空格之前的字符,空行不输出)
for /f %%i in (1.txt 2.txt) do (
  echo %%i
)

依次读取运行路径下的1.txt和2.txt文件
for /f "eol=s" %%i in (1.txt) do (
  echo %%i
)

读取运行路径下的1.txt,并显示第一个字符不是s的行信息,每行信息遇到空格终止(eol只能数值一个字符)
for /f "skip=2" %%i in (1.txt) do (
  echo %%i
)

读取运行路径下的1.txt,跳过前2行输出
for /f "delims=," %%i in (1.txt) do (
  echo %%i
)

读取运行路径下的1.txt,并显示每一行内容(每一行信息遇到,终止)
for /f "delims=,;" %%i in (1.txt) do (
  echo %%i
)

读取运行路径下的1.txt,并显示每一行内容(每一行信息遇到,或;终止)
for /f "tokens=1,2,3" %%a in (1.txt) do (
  echo %%a %%b %%c
)

读取运行路径下的1.txt,并显示每一行内容(每一行信息以空格分割,第一个为%%a,第二个为%%b,第三个为%%c,小于3个时显示为空)
例:
1 2 3       echo 1 2 3
1 2         echo 1 2
1 2 3 4     echo 1 2 3

PS:变量名需根据字母表顺序,这里for循环中定义的是a,这表示第二个就是b,第三个是c
for /f "tokens=1-3" %%a in (1.txt) do (
  echo %%a %%b %%c
)

1-3 相当于 1,2,3
for /f "tokens=1-3,*" %%a in (1.txt) do (
  echo %%a %%b %%c %%d
)

*表示%%d是后续的所有的字段
例:
1 2 3 4 5 6    a=1 b=2 c=3 d=4 5 6
for /f "eol=s delims=; tokens=*" %%a in (1.txt) do (
  echo %%a
)

组合使用,相互之间以空格隔开
for /f %%a in ("C:\1.txt") do (
  echo %%a
)

输出字符串 C:\1.txt
for /f "usebackq" %%a in ("C:\1.txt") do (
  echo %%a
)

usebackq指示集中的是文件路径,主要用来处理带空格的文件路径(若是用的是单引号,表示的是字符串)
for /f "usebackq" %%a in (`set`) do (
  echo %%a
)

``中的字符串会被当作命令执行,并遍历执行后的结果

另外,FOR 变量参照的替换已被增强。你现在可以使用下列选项语法:

     %~I          - 删除任何引号("),扩展 %I
     %~fI        - 将 %I 扩展到一个完全合格的路径名
     %~dI        - 仅将 %I 扩展到一个驱动器号
     %~pI        - 仅将 %I 扩展到一个路径
     %~nI        - 仅将 %I 扩展到一个文件名
     %~xI        - 仅将 %I 扩展到一个文件扩展名
     %~sI        - 扩展的路径只含有短名
     %~aI        - 将 %I 扩展到文件的文件属性
     %~tI        - 将 %I 扩展到文件的日期/时间
     %~zI        - 将 %I 扩展到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串

可以组合修饰符来得到多重结果:

     %~dpI                - 仅将 %I 扩展到一个驱动器号和路径
     %~nxI                - 仅将 %I 扩展到一个文件名和扩展名
     %~fsI                 - 仅将 %I 扩展到一个带有短名的完整路径名
     %~dp$PATH:I    - 搜索列在路径环境变量的目录,并将 %I 扩展到找到的第一个驱动器号和路径。
     %~ftzaI              - 将 %I 扩展到类似输出线路的 DIR

for /r %%i in (*) do (
  echo %%~xi
)

输出相对路径下文件的扩展名

5.变量延迟

批处理解释代码时,是先读出当前行的代码并解析,for及之后的代码也是一次加载并解释的。这就导致for之后的代码中的变量设置了并没有立即生效。如果想要立即生效,需要启用变量延迟。

  • setlocal enabledelayedexpansion
    启用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
  • setlocal disabledelayedexpansion
    禁用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
setlocal enabledelayedexpansion
for /L %%i in (1,2,60) do (
  set /a val=%%i+1
  echo var1=%%i var2=!val!
)
endlocal
setlocal enabledelayedexpansion
for /L %%i in (1,1,100) do (
  set /a val+=%%i
  echo !val!
)
echo %val%
endlocal

 

posted @ 2022-04-16 01:16  Bridgebug  阅读(457)  评论(0编辑  收藏  举报