for是批处理中最复杂,也最强大的关键字。熟练掌握for的用法,才可能理解批处理的强大之处。
for是对一组文件中的每一个文件执行某个特定命令。
FOR %variable IN (set) DO command [command-parameters]
rem 遍历c盘的所有文件(不包括文件夹),然后输出到控制台
for %%i in (c:\*.*) do @echo %%i
rem 以空格为分隔符,将a、b、c逐行输出到控制台
for %%i in (a b c) do @echo %%i
rem 字符串加""则认为不分割,%~i不显示双引号
for %%i in ("a b c") do @echo %%~i
rem 遍历所有磁盘,判断存在的并输出至控制台
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
rem 使用通配符输出当前目录下所有后缀为.txt的文件名
for %%i in (*.txt) do echo %%i
rem 使用通配符输出当前目录下所有后缀为.txt文件名只有2个字符的文件名
for %%i in (??.txt) do echo %%i
FOR /D %variable IN (set) DO command [command-parameters]
rem 循环输出当前目录下所有的目录名
for /d %%i in (*) do echo %%i
rem 循环输出当前目录下,目录名最后字符为a的所有目录名
for /d %%i in (*a) do echo %%i
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
rem 遍历当前目录下所有目录,"/\."三者效果相同
for /r %%i in (.) do @echo %%i
for /r %%i in (\) do @echo %%i
for /r %%i in (/) do @echo %%i
rem 遍历指定目录
for /r e:\ %%i in (.) do @echo %%i
rem 遍历当前目录下所有文件并显示完全路径(包括子目录)
for /r e:\ %%i in (*) do @echo %%i
for /r e:\ %%i in (*.txt) do @echo %%i
FOR /L %variable IN (start,step,end) DO command [command-parameters]
rem 从1开始,以2为步进值,循环到不超过10(包括等于)
for /l %%i in (1, 2, 10) do @echo %%i
rem 从10开始,以-2为步进值,循环到不小于0(包括等于)
for /l %%i in (10, -2, 0) do @echo %%i
FOR /F [“options”] %variable IN (file-set) DO command [command-parameters] FOR /F [“options”] %variable IN (“string”) DO command [command-parameters] FOR /F [“options”] %variable IN (‘command’) DO command [command-parameters]
rem 读取当前目录的a.txt,并显示每一行的内容(每一行内容遇到空格即终止)
for /f %i in (a.bat) do @echo %i
rem 读取多个文件,并显示每一行的内容(每一行内容遇到空格即终止)
for /f %i in (a.bat b.txt) do @echo %i
rem 忽略以"s”开头的行 for /f "eol=s“ %i in (a.bat) do @echo %i
rem 跳过前5行
for /f "skip=5" %i in (a.bat) do @echo %i
rem 集中的分隔符默认为空格和tab键
rem 通过delims=显式指定分隔符
for /f "delims=," %i in (a.bat) do @echo %i
rem 通过delims=显式指定分隔符,可以指定多个
for /f "delims=,;" %i in (a.bat) do @echo %i
rem 提取分隔字符串指定部分
for /f "delims=, tokens=1" %%i in (test.txt) do echo %%i
rem 可以提取多个,从最前面指定的%%i顺序往后取
for /f "delims=, tokens=1,2,3,4,5" %%i in (test.txt) do echo %%i %%j %%k %%l %%m
rem 上面的代码可以简化如下
for /f "delims=, tokens=1-5" %%i in (test.txt) do echo %%i %%j %%k %%l %%m
for /f "delims=, tokens=1-3,4,5" %%i in (test.txt) do echo %%i %%j %%k %%l %%m
rem *表示4之后的全部不分隔
for /f "delims=, tokens=1,2,3,4,*" %%i in (test.txt) do echo %%i %%j %%k %%l %%m
rem 集中的路径被当作字符串处理
for /f %%a in (“C:\Documents and Settings\Administrator\桌面\note.txt”) do echo %%a
rem usebackq指示集中的是文件路径
for /f "usebackq" %%a in (“C:\Documents and Settings\\note.txt”) do echo %%a
rem usebackq后面集中的单引号指定是字符串
for /f "usebackq" %%a in ('C:\Documents and Settings\\note.txt') do echo %%a
rem 集中的命令以``尖引号 for /f "usebackq" %i in (`dir /s /b`) do @echo %i
rem 效果和上面相同,集中命令以单引号‘’
for /f %i in ('dir /s /b') do @echo %i
rem 组合提取指定文件中的内容
for /f "eol=; tokens=1,2* delims=,- " %%i in (d:\test.txt) do echo %%i %%j %%k
for语句只影响后面的一句代码,如果想写多句代码,必须用()。批处理解释代码时,是先读出当前行的代码并解析,for及之后的代码也是一次加载并解释的。这就导致for之后的代码中的变量设置了并没有立即生效。如果想要立即生效,需要启用变量延迟。
@echo off
setlocal enabledelayedexpansion
for /l %%i in (0, 1, 100) do (
set /a val+=%%i
@echo !val!
)
endlocal
pause
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183835.html原文链接:https://javaforall.cn