浅显易懂的win批处理指令--for指令入门

 for的基本用法是:

for 变量 in (目标) do 执行行为

不带参数的for命令

@echo off
for %%i in (1 2 3 4 5) do echo %%i
pause

输出结果:

注意上面的临时变量%%i中的i,可以换成别的字母,但只能是一位。

带参数 /L 的for

参数/L 可以理解为 "list" 的意思,大小写均可。代表一个数列,下面脚本的意思是: 就是以 1 开始,步长为1 ,结束值为2的一个等差数列

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

输出结果:

带参数 /F 的for

参数/F可以理解为“file”的意思,代码处理对象为文本串, 常用的参数有skip,tokens,delims,看示例:

@echo off
for /f "skip=1 tokens=1,2* delims= " %%a in (test.txt) do echo %%a %%b %%c
pause

test.txt的内容如下:

A1
A2 
A3+111,222.333-444/555
A4
A5

skip

for循环文本内容是以行为单位,从上至下进行的,skip=1意识就是跳过文本的第一行,即不循环第一行, 那么skip=2 自然就是跳过前两行了,依次类推...

@echo off
for /f "skip=1" %%a in (test.txt) do echo %%a %%b %%c
pause

delims

delims=后面的字符的意识是,将文本每一行的内容以delims=后面的字符分割成若干列.for默认是以,;和空格作分割符的, 所以一般要取得整行内容通常会用"delims="这样的形式来取消for的默认分割符。如果使用空格,要将空格放到最后

@echo off
for /f "tokens=1-3 delims=+./-" %%a in (test.txt) do echo %%a %%b %%c
pause

tokens

tokens=1-5,1-5很好理解就1至5,前面我们用delims=后面的字符为分割符,将文本内容分成了多列,需要的是哪些列, 用它指定,默认是1列

@echo off
for /f "tokens=1-5 delims=+./-" %%a in (test.txt) do echo %%a %%b %%c %%d %%e
pause

代码中前面有个%%a, 这里的%%a就是代表第一列, 第二列就是%%b, 第三列就是%%c 依此类推
那么我们如果把

echo %%a %%b %%c %%d %%e 

改为 

echo %%e %%d %%c %%b %%a

会如何呢? 会显示

444 333 222 111  A3

 若是第一个%%a把它改为%%i也是一样,那么第二列就是%%j...%%k...依此类推,就是按英文字母的顺序依此类推的。

如果用tokens=1,2*  有什么区别呢?

代表从几至几
, 代表单一的,如 tokens=1,5 就是代表第一列和第五列
* 代表剩下的所有的列.  如:tokens=1,2*   代表%%a为第一列,  %%b为第二列,  %%c代表后面所有的列.
@echo off
for /f "tokens=1,2* delims=+./- " %%a in (test.txt) do echo %%a %%b %%c %%d %%e
pause

 for /F 不但可以循环文本内容还可以循环字符串,如:

@echo off
for /f "tokens=1-3 delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c
pause

 

for的 /D 参数

/D参数(常用来查询当前目录或者指定目录的下的文件夹)

基本用法:for /d %variable in (set) do command [command-parameters]

@echo off
for /d %%i in (d:A\*) do echo %%i
pause>nul

如果省略 括号中的 "d:A\*",则会直接查询批处理所在目录的文件夹
假设本批处理文件保存在:d:\tt下
运行以下批处理代码,将会 查询 d:\tt下的文件夹

@echo off
for /d %%i in (*) do echo %%i
pause>nul

 For /R参数

基本用法:

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

检查以 [drive:]path 为根的目录树中,所有符合(set)的文件或者文件夹。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。


@echo off
for /r d:\tt %%i in (*) do echo %%i
pause>nul

 枚举d:\tt下所有的 .bat文件(包括子目录)

@echo off
for /r d:\tt %%i in (*.bat) do echo %%i
pause>nul

 

如果省略以上代码中的d:\tt,则会列举当前目录 所有符合(set)的文件
如:列举批处理所在目录的所有批处理文件(包括子目录)

 

@echo off
for /r %%i in (*.bat) do echo %%i
pause>nul

 for遍历文件或目录时,你一定看不懂%%~anx之类的东西,它的含义如下:

@echo off
for /r d:\tt %%a in (*) do (
  echo        a:   文件完整信息                             %%a
  echo      ~da:  保留文件所在驱动器信息                   %%~da
  echo      ~pa:  保留文件所在路径信息                     %%~pa
  echo      ~na:  保留文件名信息                           %%~na
  echo      ~xa:  保留文件后缀信息                         %%~xa
  echo      ~za:  保留文件大小信息                         %%~za
  echo      ~ta:  保留文件修改时间信息                     %%~ta
  echo     ~dpa:  保留文件所在驱动器和所在路径信息         %%~dpa
  echo     ~nxa:  保留文件名及后缀信息                     %%~nxa
  echo    ~pnxa:  保留文件所在路径及文件名和后缀信息       %%~pnxa
  echo    ~dpna:  保留文件驱动器、路径、文件名信息         %%~dpna
  echo   ~dpnxa:  保留文件驱动器、路径、文件名、后缀信息   %%~dpnxa
)
pause>nul

 

只要记住d-盘符 p-路径 n-文件名 x-文件后缀 t -修改时间 z-文件大小 这些字符分别是代表的是什么意思就可以了,些字符是可以互相任意搭配的。

 批处理指令片段

@echo off 
setlocal

set sourcedir=D:\tt
set keepDir=.git node_modules

rem 删除根目录下的文件夹
for /d %%a in (%sourcedir%\*) do (
  set isDel=1
  for %%b in (%keepDir%) do (
    if %%~nxa == %%b set isDel=
  )
  if defined isDel (
     rd /s /q %%a
  )
)
rem 删除根目录下的文件
for %%a in (%sourcedir%\*) do del %%a

 

参考文章:

[1] 浅谈批处理for命令中的变量扩展

posted @ 2021-05-04 18:26  孤舟蓑翁  阅读(975)  评论(0编辑  收藏  举报