# windows脚本入门2-控制语句

# 跳转语句

定义标签:

:标签名

跳转到标签:

goto 标签名

注意定义标签时后面是双::那么这个标签将不会起作用,可以当作注释用

实例:

@echo off
goto hi
goto :eof
:hi
echo helloworld
pause
1
2
3
4
5
6

# 选择语句

if 条件 (

) else (  

)
1
2
3
4
5

条件和"(" 还有 else和"(" 之间有一定要有一个空格,不然会出现语法错误!!!

# 判断条件

  • 等于 "==" 或者 "equ"
  • 不等于 "== 前面加 not" 或者 "neq"
  • 小于 "lss"
  • 小于或等于 "leq"
  • 大于 "gtr"
  • 大于或等于 "geq"

实例:

@echo off
set name="xie shuai"
set  num=5
if %name%=="xie shuai" (
	echo yes
)
if not %name%=="hello" (
	echo 不等于hello	
)

if %num% lss 6 (
	echo 小于6
)
if %num% gtr 4 (
	echo 大于4
)

if %num% leq 5 (
	echo 小于等于5
)

if %num% geq 5 (
	echo 大于等于5
)

if %num% equ 5 (
	echo 等于5
)

if %num% neq 8 (
	echo 不等于8
)
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 条件执行

command1 && command2

如果command1为真,则执行command2

command1 & command2

执行完command1后就执行command2

command1 || command2

在command1失败时执行command2

上面的命令执行是否成功看%ERRORLEVEL%是否等于0

实例:

@echo off
set num1=1
set num2=2
dir o: && set num2=3
echo %num2%
dir c: && set num2=3
echo %num2%

dir o: & set num2=4
echo %num2%

dir c: || set num2=5
echo %num2%

dir o: || set num2=5
echo %num2%

pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 条件判断 and or 的实现

and 实例:

@echo off
set num1=1
set num2=2
if %num1%==1 if %num2% ==2 (
	echo hello
)
pause
1
2
3
4
5
6
7

or 实例:

@echo off
set num1=2
set num2=4
if %num1%==1 goto end
if %num2%==3 goto end
goto :eof 
:end
echo hi
pause
1
2
3
4
5
6
7
8
9

# if的经典应用场景

# 判断变量是否定义:

@echo off
set num1=""
if defined num1 (
	echo num1 is defined!
)
set num2=
if defined num2 (
	echo num2 is defined!
)

set num3
if defined num3 (
	echo num3 is defined!
)
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

看来批处理中看一个变量是否定义,就是看这个变量是否被赋一个非空值

# 判断变量是否为空:

@echo off
set num1=
if "%num1%"=="" (
	echo num1 is null!
)
set num2=""
if "%num2%"=="" (
	echo num2 is null!
)

set num3=""
if "%num3%"=="""" (
	echo num3 is not null,contains ""!
)
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# For循环语句

for %%循环变量 in (集合) do command
for %%循环变量 in (集合) do (
	commands
)
1
2
3
4

注意:

  • 循环变量是26个大小写字母中的一个,区分大小写,我们平常的批处理中设置的set变量是不区分大小写的。

  • 另外"("不能换行 而且和do之间得有空格。"()"中集合的数可以用空格,tab,逗号,分号,等号分隔。

  • 如果For循环语句在cmd中,command中使用循环变量只使用一个%

实用实例:下面这些列不出隐藏属性的文件

@echo off
for %%I in (*.*) do (
	echo %%I
)
echo ——————————
for %%I in (*.bat) do (
	echo %%I
)
echo ——————————
for %%I in (????.*) do (
	echo %%I
)
echo ——————————
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# For带命令参数的几种形式

# For /f 解析文件内容:

for /f %%i in (文件名) do (commands)
for /f %%i in ('命令语句') do (commands)
for /f %%i in ("字符串") do (commands)

当文件名中有空格时就需要使用usebackq选项

for /f "usebackq" %%i in ("文件名") do (commands)
for /f "usebackq" %%i in (`命令语句`) do (commands)
for /f "usebackq" %%i in ('字符串') do (commands)
1
2
3
4
5
6
7
8
9
# For /f 分割参数,分割文件中的每行文本 或者 目标字符串:

用"delims= " 将目标分成几部分

比如"delims=,. " 将目标用","或"."分成几部分

用"tokens=" 选择分割的第几部分

比如"tokens=1,3,4-6" 选择第1,3,4,5,6部分。

如何接收这些分割的部分呢?

比如循环变量中是%%a,那么后面的几部分依次就是%%b,%%c,%%d...

特殊注意选择通配符*

比如"tokens=1,3,*",假设一共有5部分,那么我们接收第1部分,第3部分,第4和第5部分作为一个整体接收

解析文件时用的特殊参数

"skip=n" 跳过文件n行开始解析
"eol=字符" 忽略以字符开头的该行,默认忽略以;开头的行

实例: 需要一个名为test.txt文件:

姓名,年龄,身高,体重
张三,20,170,160
王五,22,180,170
李六,25,160,150
;小谢,28,170,150
1
2
3
4
5
@echo off
for /f "delims=, tokens=1,3-4" %%i in (test.txt) do (
	echo %%i;%%j;%%k
)

for /f "delims=, tokens=2,*" %%i in (test.txt) do (
	echo %%i;%%j;%%k
)
echo ————————————————————
for /f "delims=, tokens=1,3-4 skip=2" %%i in (test.txt) do (
	echo %%i;%%j;%%k
)

for /f "delims== tokens=2" %%i in ("name=ceshiname") do (
	echo %%i;%%j
)
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# For /r 递归显示文件夹

for /r 目标目录 %%i in (过滤条件) do (commands)
1

例子:

@echo off
for /r C:\Users\xie\Desktop\BatDev %%i in (*.txt) do (
	echo %%i
)
pause
1
2
3
4
5

# For /d 显示当前目录下的所有一级目录

@echo off
for /d %%i in (*.*) do (
	echo %%i
)
pause
1
2
3
4
5

# For /l 使用数值控制循环

for /l %%i in (start,stepm,end) do (commands)
1

实例:

@echo off
for /l %%i in (1,2,10) do (
	echo %%i
)
pause
1
2
3
4
5