bat-2-for循环

for循环

语法格式

FOR %variable IN (set) DO command
  • %variable 指定一个单一字母可替换的参数。
  • (set) 指定一个或一组文件。可以使用通配符。
  • command 指定对每个文件执行的命令。

依次提取set中的每一个元素,并赋值给形式变量variable,然后执行do后面的command命令;当执行完一次do后的语句之后,再提取set中的下一个元素,然后再赋值给variable,再执行一次command命令,如此循环,直到command中的所有元素都被提取完毕,该for语句才宣告执行结束。

  • 在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable

  • FOR 变量是单一字母、分大小写和全局的变量,所以 %i 不同于 %I.

  • 为了不与批处理中的%0 ~ %9这10个形式变量发生冲突,不要随意把%%I替换为%%0 ~ %%9

基本for

for %%i in (bbs.bathome.cn) do echo %%i

===============================================
bbs.bathome.cn
for %%i in (bbs,bathome,cn) do echo %%i

===============================================
bbs
bathome
cn

高级应用:

想知道当前目录下都有哪些文件吗?请用下面的代码:

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

想列出当前目录下所有的文本文件吗?请用下面的代码:

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

想列出只用两个字符作为文件名的文本文件吗?请用下面的代码:

@echo off
for %%i in (??.txt) do echo "%%i"
pause

检测当前硬盘都有哪些分区

@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause

命令扩展

1. /D 输出目录下的文件列表

FOR /D %%variable IN (set) DO command 

如果集中包含通配符,则指定部分与目录名匹配,而不与文件名匹配。

for /d %%i IN (D:\DirectUse\*) do (  --通配符:可以写成 *、?、*.exe
    echo %%i
)

2. /l 建立数字序列

FOR /L %%variable IN (start,step,end) DO command

从start开始,增量为step,到end结束,生成一个数字序列。

(1,1,5)将产生序列 1 2 3 4 5(5,-1,1)将产生序列5 4 3 2 1

for /l %%i in (1,1,5) do (  --起始值,步长,结束值
    echo %%i
)

3. /R 遍历目录搜索

FOR /R [[drive:]path] %%variable IN (set) DO command

遍历搜索[drive:]path 目录下,所有符合set规则的文件名,然后将 全文件名 赋值给形式变量variable。

  • 如果在 /R 后没有指定目录,则会自动使用当前目录。

  • 如果 set 中为具体文件名(不含通配符)(包含.),则将遍历该目录及其子目录,同时将设置的set拼接在该目录路径后面,而不管拼接后的文件路径是否存在。

  • 不会遍历隐藏文件

for /r D:\DirectUse\ %%i in (*.exe) do (
  echo %%i
)

为了只列举存在文件名为 123.exe 的路径,我们可改成下面这样:

for /r D:\DirectUse\ %%i in (123.exe) do (
  if exist %%i echo %%i  -- 判断文件是否存在
)

4. /f 文本处理

FOR /F ["options"] %variable IN (file-set) DO command   --将文本文件内容作为set
FOR /F ["options"] %variable IN ('command') DO command  --将命令执行结果作为set
FOR /F ["options"] %variable IN ("string") DO command   --String

options参数:

eol=c           - 指定每行需要忽略的结尾字符(就一个)
skip=n          - 指在开始时忽略的行数。索引从1开始
delims=xxx      - 指定用于分列的分隔符号,不指定则默认为空格。如果要关闭delims分隔,需要使用 `"delims="` 。
tokens=x,y,m-n  - 指定需要提取分列之后的那几列数据,这些数据会被按tokens中指定的顺序,封装进以for语句中定义的形式变量开头,按字母表顺序递增,自动创建的一连串形式变量中。索引从1开始

tokens中明确显示4列,但在for语句tokens和in之间只能定义起始的形式变量,至于更多的可以在do的大括号中直接使用,至于结果集中列的封装顺序 按tokens中指定列时的顺序 依次封装进以起始形式变量开头的,按字母表顺序增长的形式变量中

如果输出结果中有空格,虽然没指定delims,但仍会使用默认的delims(空格)来分割结果,此时还没有指定tokens的话,只显示第一个分隔符前的内容,后面的内容将被忽略。

tokens=m          表示提取第m列;
tokens=m,n        表示提取第m列和第n列;
tokens=m-n        表示提取第m列至第n列;依次封装相对应数量的形式变量中;
tokens=*          表示提取从第1列开始的所有列,直到行尾,都封装进一个形式变量中;
tokens=m*         表示提取从第m列到第n列,第m列封装进声明的形式变量中,后面的所有列全部封装进后续的**一个**自动创建的形式变量中;
tokens=m,*        与 tokens=m* 一致。
  • 处理文本文件(以行为单位)
for /f %%i in (C:\Users\zbf\Desktop\help.txt) do (
    echo %%i
)
  • 处理命令执行结果
for /f "tokens=1,2,3,4" %%a in ('dir /a') do (
    echo %%a ==== %%b ==== %%c ==== %%d
)
  • 处理String
for /f "tokens=1,2,3,4" %%a in ("第一列1 第二列2 第三列3 第四列4") do (
    echo %%a ==== %%b ==== %%c ==== %%d
)

形式变量增强

选项语法:

%~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命令的效果

在以上例子中,%IPATH 可用其他有效数值代替。%~ 语法用一个有效的 FOR 变量名终止。

posted @ 2022-06-13 19:43  姬雨晨  阅读(651)  评论(0编辑  收藏  举报