batch file(1) -- for statement

本文最后更新于:Thursday, December 3rd 2020, 8:46 am

1 official explanation

type for /? in your cmd.exe prompt

mark

2 common usage1

跟python里面迭代器发「iterator」很像,对一个集合的数据做相同的操作。

note:
  • 如果是在命令行,那么使用%G;在脚本文件中使用%%G
  • 如果迭代器每次产生一个值,那正好赋值为%%G
  • 如果迭代器每次产生多个值,那么系统隐式定义几个变量来保存值,默认是按字母顺序:%%H %%I %%J
  • 如果迭代器产生文件,可以使用扩展符来提取文件名称/路径/日期/大小等

1 for

1
FOR %%parameter IN (set) DO command 
  • 把一系列文件拷贝到备份
1
FOR %%G IN ("C:\demo files\file1.txt" "C:\demo files\File2.txt") DO copy %%G d:\backups\

2 for /R

1
FOR /R [[drive:]path] %%parameter IN (set) DO command
  • 如果省略[[drive:]path] 那么用当前的代替

  • set必须使用通配符?.

  • 如果(set)为(.), 那么便利每个文件夹,不遍历文件test

  1. 列出从C:\temp\开始的每个子文件夹中的每个.bak文件

    1
    For /R C:\temp\ %%G IN (*.bak) do Echo "%%G"
  2. 将’demo’文件夹和所有子文件夹中的.LOG文件重命名为.TXT:

    1
    For /R C:\demo\ %%G in (*.LOG) do Echo REN "%%G" "%%~nG.TXT"
  3. 依次将目录更改为当前文件夹下的每个子文件夹(包含自己所在文件夹)2

    1
    2
    3
    4
    5
    FOR /R  %%G in (.) DO (
    Pushd %%G
    Echo now in %%G
    Popd )
    Echo "back home"

mark

3 for /D

1
FOR /D [/r] %%parameter IN (folder_set) DO command

在几个目录/文件夹上有条件地执行一个命令。

/r 递归的进入子文件夹

  • 列出名称以“Users”开头的文件夹C:\Work\下面的每个子文件夹

    1
    2
    3
    @Echo Off
    CD \Work
    FOR /D /r %%G in ("User*") DO Echo We found %%~nxG

    4 for /L

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

有条件地对一组数字执行命令。

  • 从1数到5

    1
    FOR /L %%G IN (1,1,5) DO echo %%G
  • 非数值列表可以使用标准的for命令

    1
    FOR %%G IN (Sun Mon Tue Wed Thur Fri Sat) DO echo %%G
  • 给文件创建1000个副本

    1
    FOR /l %%G in (1,1,1000) DO copy SourceFile.txt NewFile%%G.txt

    5 for /F

1
2
3
FOR /F ["options"] %%parameter IN (filenameset) DO command 

FOR /F ["options"] %%parameter IN ("Text string to process") DO command

针对文件里面的字符处理

options:(优先级:usebackq > skip > delims > eol > tokens)

  1. delims=xxx(分隔符, 默认为空格)

  2. skip=n (文件开头要跳过的一些行,默认为0)

  3. eol=; (每行开头指示注释的字符,默认为分号;)

  4. tokens=n (指定要从每行读取哪些编号的项,默认为1)

  5. usebackq (使用交替引用的风格)

    mark

  1. 如果”delims=”,那么把一行都视为第一个token
  2. “eol=&” 一般把eol设置为不容易碰到的字符,避免把本该解释的行注释掉
  3. “skip=3” 去掉前面三个空行
  4. tokens用法:2,4,6, 2-6(2到6),*(所有), 3*(第4个起后面的)

  • 复制文本文件中列出的文件到新的目的地:

    1
    2
    假设files.txt每行包含一个文件名
    FOR /f "delims=" %%G in (files.txt) DO copy "\\source\folder\%%G" "H:\destination\%%G"
  • 从包含字符和逗号的文本文件中提取数据

    文件如下:

    January,Snowy,02
    February,Rainy,15
    March,Sunny,25

    1
    FOR /F "tokens=1,3 delims=," %%G IN (weather.txt) DO @echo %%G %%H

    结果如下:

    January 02
    February 15
    March 25

  • 解析一段字符串

    1
    FOR /F "tokens=4 delims=," %%G IN ("deposit,$4500,123.4,12-AUG-09") DO @echo Date paid %%G

    输出:Date paid 12-AUG-09

6 for /F

1
FOR /F ["options"] %%parameter IN ('command to process') DO command

命令解析:对命令的处理包括每次读取一行命令的输出,然后将该行分解为单个的数据项或“tokens”。然后执行DO命令,并将参数设置为找到的tokens。

使用场景:你想执行一些命令,把命令指令的结果提取出来并赋予变量,然后对该变量进行一系列操作

  • 只打印环境变量,不打印其值

    1
    FOR /F "delims==" %G IN ('SET') DO @Echo %G
  • 把Windows版本设置为环境变量

    1
    FOR /F "tokens=4*" %%G IN ('ver') DO SET _version=%%G 

    输出结果:

    SET _version=10.0.19042.630]

    (其中命令env输出:Microsoft Windows [Version 10.0.19042.630])

  • 列出一个文件夹中的所有文本文件,包括完整路径

    1
    FOR /F "tokens=*" %%G IN ('dir/b /s ^"c:\program files\*.txt^"') DO echo %%G

References


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!