bat 批处理:FOR命令
CMD:FOR命令,bat 批处理:FOR命令,本文总结了Windows系统下批处理命令:FOR命令的四种基本用法
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
for
、in
和do
是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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)