bat文件常用语法学习
1.echo命令
①echo 用于显示此命令后的字符。
echo Hello World!
PAUSE
注:pause是用来暂停的,直到用户输入任意键关闭。
结果:
E:\>echo Hello World!
Hello World!
E:\>PAUSE
请按任意键继续. . .
②echo off 表示此命令后的所有命令都不显示命令本身。
③@ 与echo off相似,但只是不显示当行的命令。
@echo off 是经常组合放在开头的。
@echo off
echo Hello World!
PAUSE
结果:
Hello World!
请按任意键继续. . .
2.注释
①rem
②::
@echo off
echo Hello World!
rem 我是一个注释
:: 巧了我也是一个注释
PAUSE
结果:
Hello World!
请按任意键继续. . .
3.参数标识符 %
①代表参数
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。
@echo off
type %1
type %2
pause
使用cmd,进入到对应目录下:
E:\>test a.txt b.txt
我是a我是b请按任意键继续. . .
注:test是我们写入内容的bat文件,a.txt和b.txt分别是当前目录下的两个txt,内容分别为“我是a”和“我是b”。
或者也可以新创建一个bat文件调用刚才写的bat文件:
@echo off
call test a.txt b.txt
pause
②非for语句引用变量
@echo off
set a=HelloWorld!
echo %a%
pause
注意:“set a=HelloWorld!”这句,由于编程习惯,原意在等号两边加空格,但是这样的话就会出现“ECHO处于关闭状态”的错误了。
结果:
HelloWorld!
请按任意键继续. . .
③for语句要用“%%”
@echo off
for %%i in (1 2 3 4 5) do echo %%i
pause
结果:
1
2
3
4
5
请按任意键继续. . .
4. call
①调用另一个bat文件
@echo off
echo 调用另一个bat文件:
call another
pause
another.bat:
@echo off
echo 我是另一个bat文件
pause
结果:
调用另一个bat文件:
我是另一个bat文件
请按任意键继续. . .
②带参数的
test.bat:
@echo off
echo %0 %1
pause
another.bat:
@echo off
call test.bat 我是参数
pause
运行another.bat,结果:
test.bat 我是参数
请按任意键继续. . .
③call一个应用程序(但一般都用start)
④call一个标签
@echo off
call :b
start notepad.exe
exit
:b
start b.txt
结果:
先打开b.txt,然后打开了记事本。
5. if
用于判断,类似C语言的if
①字符串判断
if [not] "参数" == "字符串" 待执行的命令
another.bat:
@echo off
call test.bat a
pause
test.bat
@echo off
if not "%1"=="a" (echo 参数不是a)else (echo 参数是a)
pause
注意:判断结束后,要和“(”之间留一个空格,“else”也要和“(”之间留一个空格。
运行结果:
参数是a
请按任意键继续. . .
②判断数值相等
@echo off
if 1 equ 2 (echo 1等于2) else (echo 1不等于2)
pause
结果:
1不等于2
请按任意键继续. . .
注:大于不能使用符号“>”,而应该使用GTR。
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
③文件判断
@echo off
if exist e:\b.txt (echo e盘下有b.txt) else (echo e盘下没有b.txt)
pause
结果:
e盘下有b.txt
请按任意键继续. . .
④判断某个变量是否已经被赋值,用 if defined str 语句
@echo off
set str=HelloWorld!
if defined str (echo 变量的值为%str%) else (echo 变量没有被赋值)
pause
结果:
变量的值为HelloWorld!
请按任意键继续. . .
⑤ if结合errorlevel使用
@echo off
xcopy e:\b.txt f:\
if errorlevel 1 echo 文件拷贝失败
if errorlevel 0 echo 文件拷贝成功
pause
注:返回值必须按照从大到小的顺序排列。
结果:
E:\b.txt
复制了 1 个文件
文件拷贝成功
请按任意键继续. . .
几个常用命令的返回值及其代表的意义:
diskcomp
0 盘比较相同
1 盘比较不同
2 用户通过ctrl-c中止比较操作
3 由于致命的错误使比较操作中止
4 预置错误中止比较
diskcopy
0 盘拷贝操作成功
1 非致命盘读/写错
2 用户通过ctrl-c结束拷贝操作
3 因致命的处理错误使盘拷贝中止
4 预置错误阻止拷贝操作
format
0 格式化成功
3 用户通过ctrl-c中止格式化处理
4 因致命的处理错误使格式化中止
5 在提示"proceed with format(y/n)?"下用户键入n结束
xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过ctrl-c中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误
6. goto
goto是跳到指定的标签位置
@echo off
goto end
echo 这里是结束标签之前的显示
:end
echo 这里是结束标签
pause
结果:
这里是结束标签
请按任意键继续. . .
7. for
(1) /f
①/f 解析文本读取字符串
@echo off
for /f %%i in (歌曲列表.txt) do echo %%i
pause>nul
结果:
序号、歌手名-歌曲名.后缀名
1、徐秉龙/桃十五-空心.MP3
2、是阿涵啊-不断电.mp3
3、河豚-二号位.MP3
4、原·味-褐瞳.lrc
5、徐薇-空心.mp3
可以显示文件的内容。如果去掉“/f”,并且把“歌曲列表.txt”改成“*.txt”,就可以搜索当前目录下txt文件并显示文件名:
@echo off
for %%i in (*.txt) do echo %%i
pause>nul
结果:
b.txt
歌曲列表.txt
② delims
做分隔符使用,只会保留分隔符之前的内容。
@echo off
for /f "delims=-" %%i in (歌曲列表.txt) do echo %%i
pause>nul
结果:
序号、歌手名
1、徐秉龙/桃十五
2、是阿涵啊
3、河豚
4、原·味
5、徐薇
注:若要填入多个分隔符,则写在等号后就好,中间无需加空格
③ tokens
选定分割之后的内容。
@echo off
for /f "tokens=1,2 delims=、." %%i in (歌曲列表.txt) do echo %%i %%j
pause>nul
结果:
序号 歌手名-歌曲名
1 徐秉龙/桃十五-空心
2 是阿涵啊-不断电
3 河豚-二号位
4 原·味-褐瞳
5 徐薇-空心
说明:
tokens=有时表示提取全部。
tokens=m表示提取第m列。
tokens=m,n表示提取第m列和第n列。
tokens=m-n表示提取第m列至第n列。
Tokens=*表示删除每行前面的空格。忽略行首的所有空格。
tokens=m*提取第m列以后的所有字符,星号表示剩余的字符。
tokens=m,*提取第m列以后的所有字符,星号表示剩余的字符。
“%%i %%j”对应于“token”后面的列数。有多少列就要有多少个输出变量,并且各变量中的字母存在先后顺序。
(2) /L
/L参数是以增量形式从开始到结束的一个数字序列的迭代数值范围。
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
结果:
1
2
3
4
5
请按任意键继续. . .
8. rd
删除文件夹
① rd d:\test
只能删除空的文件夹,否则会提示:目录不是空的。
② rd /s test
能达到删除文件夹的作用,但是会询问是否确认(Y/N)?
③ rd /q /s test
安静模式,带 /S 删除目录树时不要求确认。