批处理
- 定义:批处理命令是dos系统下的命令合集,还可以使用if goto start等控制命令,实现业务逻辑
- 语法同dos命令
命令
- echo 命令:
- echo on \ echo off 打开或关闭回显。回显是指执行的命令会显示在命令窗口上。但是有个问题是,关闭回显后无法在bat执行过程中输入数据
- REM:注释作用,一行后面的都是注释掉的内容(可用::代替,但是建议使用ram,兼容性更好)
- SET:
- 用法:set k=v 。如果v为空,则是重置k的值
- set /p k=“输入提示词”
- set /a k=表达式 表达式是计算式子,如 2*3、1+1
- 支持运算符前置:a=a2 等价于 a=2
- IF:
- 字符串的比较 :if %val%==m_val (// TODO)
- 数字的比较:if %num1% EQU %num2% (// TODO)
- if 可接 else 后可再接 if
set /p a=input a: set /p b=input b: if %a% EQU %b% ( echo 123 ) else if %a% GTR %b% ( echo 234 ) else ( echo 345 )
- 比较运算符
EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于
- 判断文件是否存在
if exist E:\cmder ( echo yes ) else ( echo no ) if not exist filname echo no
- 判断变量是否定义
if defined var (// TODO)
- 判断返回值(上一条命令的结果)。一般的返回值为0或者1,0表示执行成功,1表示失败
上一条命令的类型有很多种,命令的返回值类型如下1echo 123 >> .\file.txt; if errorlevel 0 ( echo success ) else ( echo error )
- GOTO:将程序跳转到指定标签
set /p a= input a: if %a% == 1 ( goto yes ) echo no goto end :yes echo yes :end
- FOR:
- 对一组文件的每个执行命令
set filePath=.\shellFile\ for %%i in (1 2 3 4 5) do bash %filePath%test%%i.sh
- for /L %%var in (start , step , end) do // TODO /L表示步进的循环
for /L %%i in (1, 1, 5) do echo %%i
- for /R <DRIVE:>path %%i in (set) do // TODO /R后接文件路径表示遍历path下的文件合集,set为*可遍历文件树下的所有文件,set为 . 会遍历文件树下的所有文件夹
for /R .\ %%i in (*) do echo %%i
- for /F %%i in (filename) do // TODO /F 用于读取文件(filename),如果没有/F 会直接看作是"filename"字符串。
/F 参数除了处理文件也可以处理字符串,将filename换成目标字符串再加个双引号即可/* test.txt 1,1 2,1 3,1 4,1 A1,2 2,2 3,2 4,2 1,3 2,3 3,3 4,3 A1,4 2,4 3,4 4,4 */ rem 如上建立一个文件 for /F "tokens=2" %%i in (test.txt) do echo %%i rem 按照空格为分隔符输出第二列字符串 for /F "delims=, tokens=2" %%i in (test.txt) do echo %%i rem 也可以如上用delims指明分隔符,用“,”做分割,再根据tokens输出 for /F "eol=A skip=1 delims=, tokens=2" %%i in (test.txt) do echo %%i rem eol用于忽略开头是A的行(但是只支持单字符) rem skip可以跳过开头的几行
/F 支持多文件操作的,以空格为分隔符。但是如果文件中有空格怎么办?这时需要用到 usebackq 参数,可以将文件用 “” 双引号给包含进去。for /F "tokens=*" %%i in ("1 2 3 4") do echo %%i
for /F %%i in (file1.txt file2.txt) do echo %%i for /F "usebackq" %%i in ("file1.txt" "file2.txt" "file 3.txt") do echo %%i
- 对一组文件的每个执行命令
特殊语法
- 变量延迟特点:变量的值在一个语句执行完之前不会改变
见如下用例:set a=1 set a=2&echo %a% echo %a% rem 输出结果: rem 1 rem 2
因为有 & 符号让 (set a=2&echo %a%) 语句在一次命令中执行,此时a的值还是1。此行为被成为变量延迟
- %systemroot% 变量值是系统根目录 一般是C盘windows目录
- 文件里有回车即表示是一条新的命令,操作符中间的回车会被忽略
- rem 注释也可以被 :: 代替。:: 即是不规范的标签命名方式,因为标签所在的这一行不会被执行
- 命令行最多可接受9个参数给批处理文件,从%1~%9,%0是命令自身。如果读取的%n,参数n不存在,则默认是空
- 隐藏命令:@ + 命令 。可以把命令隐藏不回显到输出流上,用echo off同样可以实现,@需要在每个命令前加一个
- && || 对命令执行的判断。 命令执行后有执行成功和失败,之前可以用errorlevel判断成功与否,&& || 同样可以。在命令执行结束后如果成功走&&后的命令,执行失败走||后的命令。
echo 111 && echo success
- 管道 | 。把前一个命令的执行结果发送给后一个命令
- 分行符 & 。几个命令写在同一行用&分隔
echo 1 & echo 2
- 分行符 ^ 。用于一个命令内部,将一个命令写成几行
ec^ ho 1^ 11
- 转义符 ^
比如想输出&,但是&是命令符,会被识别成分行符,想输出的话需要在前面加个^,转义成字符。rem echo & echo ^&
- 重定向 >> 、>、<
>>用于将命令输出追加到文件目标文件中
> 输出覆盖目标文件
< 从目标文件中读取数据echo aaa >> 1.txt echo bbb > 1.txt rem 重定向读取 @set fileName=redirect.txt @echo 1 > %fileName% @set /p num1=<%fileName% @echo %num1% @echo 2 > %fileName% @set /p num2=<%fileName% @echo %num2% @set /a num3=num1 + num2 @echo %num3%
- pause>nul 命令执行完后,会直接执行结束,有时希望在命令结束后等待输入再结束,此时在程序最后加一个pause。pause会转换成提示输入的话,如果不想让这句话显示在输出流里,可以用>重定向到某个文件或者到nul里。nul是空的意思,即到空文件中。
- 有不懂的命令,可以在命令关键字后面加 /?,执行后会输出该命令的用法
命令返回值
backup
0 备份成功
1 未找到备份文件
2 文件共享冲突阻止备份完成
3 用户用ctrl-c中止备份
4 由于致命的错误使备份操作中止
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 拷贝过程中写盘错误 ↩︎