前言
cmd提供了三个命令实现控制结构,if、 for、 goto,均与c等语言中有相似之处,但是又有差异。
正题
一.if
1. if [Not] ErrorLevel number command 等价于 if %ErrorLevle% gtr number command,一般用来判断上一个命令是否执行成功
2. if [Not] exist filename/foldername command 判断是否存在指定文件/目录
3.if [Not] string1 == string2 判断string1与string2是否相等
else 语义与c等编程语言相同,为了书写的美观,可以写成这个样子
if condition (
command
) else (
command
}
如果开启了CmdExtension(参照“变量”那篇博客),则具有以下功能(默认开启CmdExtension):
4.if /i string1 oprator string2 command
oprator:
equ/neq 相等/不相等,配合/i表示忽略大小写
gtr/lss 大于/小于,将取出string1与string2中的数字字符连接为一个整数(依然有数据范围,不适宜大数比较),进行比较(无视小数点和负号)
gtq/lsq 大于等于/小于等于
5.if defined var command 判断var是否被定义
6. if cmdextversion number command 与errorlevel类似
二.for
1.for var in (set) do command var
在终端中用 %变量名 表示,在脚本中用 %%变量名 表示,%变量名对set中的元素进行遍历
2.for /L var in (start, step, end) do command
var从start开始,每次增加step,直到var或者超过var为止(注意这个包含end,而在其他语言中往往包含头部不包含尾部)
3.for /R [目录] var in (set) do command
var遍历目录并遍历set,每次var将得到值目录下一级子文件+set中元素,当目录省去则默认为当前目录,例如:E盘下有两个文件夹folder1, folder2
for /R E:\ %i in (1 2 3) do echo %i
将会输出:
E:\folder1\1
E:\folder2\1
E:\folder1\2
E:\folder2\2
4.for /D var in (set*) do command
主要用于set为包含通配符的情况,将会筛选出其中的目录名
5.for /F ["eol=c skip=n delims=xxx tokens=x,y usebackq"] var in (filename/`command`/'string') do
主要用于set为文本文件名时,eol表示"endOfLine",即结尾的标志,默认为回车/换行符,delims表示分隔符,tokens:x,y,z,...表示要选的第n项,usebackq表示将获取的分词作为命令执行,后面的变量将会根据字典顺序确认变量名,例如
for /F "delims=, tokens=1,3,5" %i in (test.csv) do echo %i %j %k %l %m %n
将会打印出test.csv的每行的第1,3,5项
三.goto
:label
goto lebel将执行跳转到label处,某种意义上可以实现循环的break操作,在windows中break命令不可用
总结
可以看到cmd对于控制语句的支持并不是很强(但是for /f参数绝对是强大无比),在运算方面的能力很弱,在遇到复杂的计算时需要编程语言来代劳,不过能够处理一些基本的操作。