for %%a in (123) do for %%a in (234) do for %%a in (345) do echo %%a
::其实如果只读取最后一层for的参数,即使多层for嵌套也可以使用同样的参数,比如%%a
for %%z in (!tmp!) do echo !%%z!
::目前已知的摆脱call实现多层变量嵌套的最好方法,不少人用
2、for /l
for /l %%a in () do echo
::无限循环,步数为0也是一样的效果,但是没这个简洁
for /l %%a in (-4 1) do echo %%a
::for /l中的三项参数从左至右的三位分别是初始值、步数、终止点,当用户给定的数量不足时,将按从右至左的顺序把不足的一项赋为0
3、for /d /r
for /r /d %%a in (*) do echo %%a
::可以遍历所有子文件夹,之所以可以联用r开关和d开关是因为它们的参数有交集,l开关和f开关就不行了。
4、for /f
for /f本身的技巧并不是特别多,它的优势是能够将其他命令的输出作为输入来分析,所以for /f可以说是当之无愧的内部命令之王
for /f "tokens=* delims=0123" %%a in ("0000123456") do echo %%a
::去除前缀的n个字符
for /f "skip=99" %%a in (1.txt) do echo 1.txt至少100行
::以前看到某版主写的,印象颇深。
for /l %%a in (1 1 10) do (
for /f "tokens=1,2* delims=" %%a in ("!tmp!") do (
for %%c in (%%a %%b) do echo %%c
set tmp=%%c
)
)
::将tokens的取值范围无限拓展
set tmp=123=234=345=456
for /l %%a in (1 1 40) do (
for /f "tokens=1,2* delims==" %%a in ("!tmp!") do (
set str=!str!,%%a,%%b
set tmp=%%c
)
)
echo %str:~1%
::有时候set变量替换是无法替换一些特殊字符的,此时可以用for /f处理
set test=d:test
for %%a in (test.*) do (
if "%%~za" neq "%%~z$test:a" replace /p /u "%%a" "%%~dp$test:a"
)
::判断当前目录下以test为名的文件是否在d:test文件夹下存在同名文件,如果存在且大小不同、修改日期更早,则替换之,否则不做处理。for帮助信息中的“%%~dp$path:a”参数似乎没见人用过,虽然它的适用范围很狭隘,但是特定的情况下不妨一试。
setlocal enabledelayedexpansion
set t=tmp
set @=t
for /f %%a in ('echo !%@%!') do echo !%%a!
::另一种三层嵌套方法,其实不实用。
三、findstr 篇
我最钟爱的命令,可惜外部命令的启动速度太慢,所以实际运用时较少露面。
findstr /s /m .* *.*
::其实findstr也是一个dir,虽然比dir慢些,却多了查找文件内容的功能
findstr /n .* 1.txt|findstr "^5000:"
::非常实用的取指定行的方法,配合正则可以取指定范围之内的行
set /p n=请输入数字或大小写字母
(echo !n!)|findstr /i "[0-9a-Z]"&&echo 输入有误!
::这个够实用吧?不解释
dir|findstr ['-Z]
::利用findstr和if命令中字符的实际大小顺序实现查找含有宽字符的行









