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循环时,写法如下:
在cmd窗口或者os.system(shell)时:

for %I in (sequence) do command

在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命令用作文本处理时,写法如下:
在cmd窗口或者os.system(shell)时:

for /f %I in (file) do command

在bat文件时:

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

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命令括号内的内容可以是其他命令,写法如下:
在cmd窗口或者os.system(shell)时:

for /f %I in ('command1') do command2

在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是路径、文件名等路径信息时,可快速进行转换,写法如下:
在cmd窗口或者os.system(shell)时:

for /f %I in (*.*) do echo %~nI

在bat文件时:

for /f %%I in (*.*) do echo %%~nI

路径扩充的具体指令有:

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

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

在cmd窗口或者os.system(shell)时:

for /f %I in ('DIR %CD%\*.txt  /A-D /B /S /ON') do echo %~nxI>>log.txt

在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

———————————————————————————————
原文链接:https://blog.csdn.net/u011079613/article/details/119651568

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐