本帖最后由 zm900612 于 2011-6-24 16:08 编辑
二、for 篇:
这是批处理中最强的内部命令,没有之一!
1、for(无开关)- for %%a in (c:\*.*) do echo %%a
- ::显示C盘根目录下所有非隐藏、非系统属性文件
复制代码
- for %%a in (.\..) do echo %%~nxa
- ::显示上一级目录的文件夹名
复制代码
- set str=123,234,345
- set str=%str:,=\%
- for %%a in (%str%\..) do echo %%~nxa
- ::用前一个技巧,巧取倒数第二段字符串,与for /f "delims=\"相映成趣
复制代码
- for %%a in (*.txt) do (
- for /f "useback delims=" %%b in ("%%a") do (
- set str=%%b
- for %%c in ("!str:分隔符=" "!") do (
- for /f "tokens=1*" %%d in (%%c) do echo %%~d
- )
- )
- )
- ::不带参数的for与for /f配合,威力极大,仅举此一例
复制代码
- 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!
- ::另一种三层嵌套方法,其实不实用。
复制代码
|