CMD:FOR命令

CMD:FOR命令

  • 0 前言
  • 1 for循环功能
    • 1.1 基本命令
    • 1.2 示例:字符串序列用法
  • 2 文本处理功能
    • 2.1 基本命令
  • 3 对命令执行结果进行处理
    • 3.1 基本命令
    • 3.2 示例:结合for和dir语句
  • 4 路径扩充
    • 4.1 基本命令
    • 4.1 示例:搜索当前目录和子目录下所有的txt文件,只记录文件名和扩展名
  • 5 兼容参数usebacq
    • 5.1 路径兼容
    • 5.2 命令兼容
    • 5.3 字符串兼容

0 前言

批处理的for命令主要有4个用法:

  • for循环
    for %I in (sequence) do command
  • 文本处理
    for /f %I in (file) do command
  • 对命令执行结果进行处理
    for /f %I in ('command1') do command2
  • 路径扩充
    for /f %I in (pathset) do command

1 for循环功能

1.1 基本命令

批处理的for命令用作for循环时,写法如下:

  1. 在cmd窗口或者os.system(shell)时:
for %I in (sequence) do command
  1. 在bat文件时:
for %%I in (sequence) do command

  • forindo是for语句的关键字,它们三个缺一不可
  • sequence是任何序列,可以只有一个元素。元素可以是变量、字符串,元素之间用空格键、tab键、逗号、分号或等号分隔
  • sequence必须用()包围,即使只有一个元素
  • %%I是形式变量,即使没有在command中被使用,也不能省略
  • for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I%%i会被认为不是同一个变量
  • 为了不与批处理中的%0%9这10个形式变量发生冲突,请不要随意把%%I替换为%%0~%%9中的任意一个
  • for语句依次提取(sequence)中的每一个元素,把它的值赋予形式变量I,带到do后的command中参与命令的执行;当执行完一次do后的语句之后,再提取(sequence)中的下一个元素,再执行一次command,如此循环,直到(sequence)中的所有元素都已经被提取完毕,该for语句才宣告执行结束

1.2 示例:字符串序列用法

for %I in (A,B,C) do echo %I

结果

A
B
C

2 文本处理功能

2.1 基本命令

批处理的for命令用作文本处理时,写法如下:

  1. 在cmd窗口或者os.system(shell)时:
for /f %I in (file) do command
  1. 在bat文件时:
for /f %%I in (file) do command

  • /f表示读取文件file内容,以行为单位赋给%%I
    • 默认情况下,每行以空格键作为分隔符分割为第1节、第2节。。。默认只读取第1节赋值给%%I
    • 默认情况下,忽略以分号;打头的行

for /f语句有以下可选参数:


  • "delims= ":设置分隔符,默认为空格
    • 可以多选,比如"delims=,; "表示同时使用逗号、分好、空格作为分隔符,注意代码中有空格
    • 可以为空,此时"delims="到双引号或者下一个参数不能有任何空格,否则会理解为使用空格作为分隔符,比如"delims=""delims=tokens=1"

  • "tokens=":每行读取第几节字符,节数从1开始,默认为1
    • 可以多选,用逗号隔开,用-表示区间,如"tokens=1,3,5",如"tokens=1-5,6"
    • "tokens="后面指定了多个数字,for /f 语句对这种情况做如下规定: 如果形式变量为%%I,那么,第一个数字指代的内容用第一个形式变量%%I 来接收,第二个数字指代的内容用第二个形式变量%%J来接收,第三个数字指代的内容用第三个形式变量%%K 来接收。其中,形式变量遵循字母的排序,第 N 个形式变量具体是什么符号,由第一个形式变量来决定
    • "tokens="中可以使用*表示余下全部内容作为一个整体,*的优先级低于数字。比如"tokens=*"表示整行作为第1节,"tokens=1,*"表示除第1节外,剩下全部内容作为第2节

  • "skip=n":表示跳过第1到第n行,从n+1行开始读取,默认n=0

  • "eol=":表示忽略以指定字符打头的行,只能指定1个字符,输入多个只有第一个起效。默认为分号
    • 可以为空

  • 多个字符型参数写到一对双引号下,如以下语句和默认结果等效
    for /f "delims= tokens=1eol=;"

3 对命令执行结果进行处理

3.1 基本命令

批处理的for命令括号内的内容可以是其他命令,写法如下:

  1. 在cmd窗口或者os.system(shell)时:
for /f %I in ('command1') do command2
  1. 在bat文件时:
for /f %%I in ('command1') do command2

  • 'command1'必须加单引号,表示将command1执行的结果视为文本对象进行处理

3.2 示例:结合for和dir语句

for /f %%I in ('dir %CD%\*.*  /A-D /B /S /ON') do echo %%I

4 路径扩充

4.1 基本命令

当批处理的for命令形式变量%%I是路径、文件名等路径信息时,可快速进行转换,写法如下:

  1. 在cmd窗口或者os.system(shell)时:
for /f %I in (*.*) do echo %~nI
  1. 在bat文件时:
for /f %%I in (*.*) do echo %%~nI

路径扩充的具体指令有:

变量%I的扩充 作用
%~fI 将 %I 扩充到一个完全合格的路径名
%~nI 仅将 %I 扩充到一个文件名
%~xI 仅将 %I 扩充到一个文件扩展名
%~nxI 仅将 %I 扩充到一个文件名和扩展名
%~dpI 仅将 %I 扩充到目录,以\结尾

4.1 示例:搜索当前目录和子目录下所有的txt文件,只记录文件名和扩展名

  1. 在cmd窗口或者os.system(shell)时:
for /f %I in ('DIR %CD%\*.txt  /A-D /B /S /ON') do echo %~nxI>>log.txt
  1. 在bat文件时:
for /f %%I in ('DIR %CD%\*.txt  /A-D /B /S /ON') do echo %%~nxI>>log.txt

结果:

1.txt
2.txt

5 兼容参数usebacq

5.1 路径兼容

在批处理命令for /f %I in (file) do command中,文件路径不需要引号。但是如果文件路径或者文件名存在空格、&等特殊符号,便无法识别,此时使用"usebacq"参数后,文件名可以使用双引号围起来
错误:

for /f %I in (a&b.txt) do command

正确:

for /f "usebacq" %I in ("a&b.txt") do command

5.2 命令兼容

在批处理命令for /f %I in ('command1') do command2中,如果command1内包含单引号,便无法识别,此时使用"usebacq"参数后,command1可以使用后引号`(和~同一个键)围起来

正确:

for /f "usebacq" %I in (`command1`) do command2

5.3 字符串兼容

在批处理命令for %I in (sequence) do command中,如果sequence是字符串,需要用双引号包围。如果字符串内本身有双引号作为字符,此时使用"usebacq"参数后,sequence可以使用单引号围起来

正确:

for "usebacq" %I in ('str="a"') do command

你可能感兴趣的:(Window办公,cmd)