for命令详解(3)

一.基本格式

FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数
(set) 指定一个或一组文件,可以施一公通配符
command 指定对每个文件执行的命令
command-parameters 为特定命令指定参数或命令行开关

二.FOR参数

1.参数/D详解

定义: FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配
解析: 如果集合(set)包含通配符("*"和"?"),将对与集合(set)相匹配的每一个目录(不是指目录中的文件组)
执行指定的Command,这个参数主要用于目录搜索,不是搜索文件

实例:
@echo off
echo C盘根目录下所有目录名:
for /d %%x in (c:*) do (
echo %%x
)
pause>nul
在这里插入图片描述

2.参数/R详解

定义: FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以[drive:]path为根的目录树,指向每个目录中的FOR语句.
如果在/R后没有指定目录规范,则使用当前目录,如果仅为一个单点(.)字符,则枚举该目录树
解析:
通过/D参数知道,/D参数显示指定路径或者当前路径下的目录名,/R也是跟目录有关
/R参数可以把指定路径下或者当前目录下的文件名全部读取,注意是文件名,不是目录名

实例1:
在这里插入图片描述
echo 查看当前目录和目录下文件夹名
for /r %%x in (.) do (
echo %%x
)
pause>nul

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实例2:
@echo off
echo 在C盘中搜索具体文件名为“a.bat”:
for /r c:\ %%i in (a.bat) do (
echo %%i
)
pause
在这里插入图片描述
备注:
如果集合(set)中为具体文件名,不包含通配符,则枚举该目录树(即枚举该目录及其下面的所有子目录),而不管集合(set)中指定文件是否存在,就是它会搜索C盘中一切可能有“a.bat”文件的路径,不管存不存在都会给出路径结果。

实例3:
解决上述问题
@echo off
echo 在C盘中搜索具体文件名为“a.bat”:
for /r c:\ %%i in (a.bat) do (
if exist %%i echo %%i
)
pause
在这里插入图片描述

注意:
1.集合(set)中文件名如果包含通配符("*“HE “?”),则列举/R参数指定的目录及其下面的所有子目录中与集合(set)相符合所有文件.
2.如果集合(set)中为具体文件名,不包含通配符,则枚举该目录树(即枚举目录下及其下面的所有子目录),而不管集合(set)中指定文件是否存在,”."代表当前目录

3.参数/L详解

定义:FOR  /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列.
解析:start起始值,增长step值,直到超过end的值停止

实例:
@echo off
echo 正步循环
for /L %%i in (1,1,3) do (
echo %%i
)
echo.
for /l %% in (3,-1,1) do (
echo %%i
)
pause

在这里插入图片描述

4.参数/F详解(掺杂个人理解)

定义:
(1)FOR /F [“options”] %variable IN (file-set) DO command [command-parameters]
(2)FOR /F [“options”] %variable IN (‘string’) DO command [command-parameters]
(3)FOR /F [“options”] %variable IN (‘command’) DO command [command-parameters]
或者,如果有 usebackq 选项:
FOR /F [“usebackq options”] %variable IN (file-set) DO command [command-parameters]
FOR /F [“usebackq options”] %variable IN (‘string’) DO command [command-parameters]
FOR /F [“usebackq options”] %variable IN (command) DO command [command-parameters]
二者差不多,区别是前面带useebacq的delims只识别-分割符其它不识别

fileset为一个或多个文件名,继续到fileset中的下一个文件之前,每份文件都被打开,
读取并经过处理.处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多
的符号.然后用已找到的符号传变量值调用For循环.以默认方式,/F通过每个文件的每一行
分开的第一个空白符号.跳过空白行.你可通过指定可选"options"参数替代默认解析操作.
这个带引号的字符串包括一个或多个指定不同解析关键字,这些关键字为:
选项(options)参数:
eol=c:  指一个行注释字符的结尾(就一个)
skip=n: 指在文件开始忽略的行数
delims=xxx: 指分割符集.这个替换了空格和制表符的默认分割符集
token=x,y,m-n: 指每行的哪一个符号被传递到每个迭代的for本身.这会导致额外变量名称的分配.m-n格式
为一个范围,通过nth符号指定mth.如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号
解析之后

实例
在这里插入图片描述
结果:
在这里插入图片描述

解析:

  1. eol=值 忽略的行数,如果eol=1 结果为:只有21和31两行内容
  2. tokens=1,3* 代表显示的列数(不显示第2列)等效写法1-3*(默认显示第一列)
  3. delims=,- 代表上述操作生效的地方要包含这些分割符(tokens后面一个参数两边分隔符为空)默认空白分割符是包含的