116180613559847980
前言
Windows命令提示符(cmd.exe)是Windows NT下的一个用于运行Windows控制台程序或某些DOS程序的壳层程序;或在Windows CE下只用于运行控制台程序的壳层程序。它被用于替代Windows 9x系统中所提供的COMMAND.COM和“MS-DOS提示符”。命令提示符的最初版本由Therese Stowell开发。(维基百科)
运行脚本
.bat脚本是旧版脚本,遇到报错的命令会继续后续命令执行
.bat脚本保留了非常老旧的DOS兼容逻辑
.bat脚本使用部分高级语法扩展时需要先手动开启setlocal enabledelayedexpansion
.cmd脚本是新版脚本,遇到报错的命令会终止后续命令执行
.cmd脚本淘汰了非常老旧的DOS兼容逻辑
.cmd脚本默认支持高级语法扩展
关闭所有命令回显
关闭当前命令回显
注释
::定义的注释不能放在其他命令末尾,会被当作命令参数
输出语句
变量
系统内置变量
| 变量 |
值 |
%0 |
当前命令名 |
%1、%2、…、%9 |
第1个参数、第2个参数、…第9个参数 |
%* |
将所有参数不保留中间空格拼接为一个字符串 |
%cd% |
当前工作目录 |
%date% |
当前日期 |
%time% |
当前时间 |
%errorlevel% |
上一条命令退出返回的状态码 |
%%i |
for循环的临时变量 |
定义变量
- 等号左右不能包含空格
- 值不可以用双引号包裹,否则双引号会被当作值
获取变量
运算符
算数运算符
+(正号)、-(负号)
+(加号)、-(减号)、*、/、%%(取余)
++(自增)、--(自减)
关系运算符
GTR(大于)、LSS(小于)、GEQ(大于等于)、LEQ(小于等于)、EQU(等于)、NEQ(不等于)
==(字符串等于)
exist(文件存在)、not exist(文件不存在)
1
| if exist "<dir_or_file>" <cmd>
|
逻辑运算符
&&:上一条命令执行完,退出码为0才会执行下一条命令,否则不执行下一条命令
&:上一条执行完,结果无论成功或是失败都会执行下一条命令
||:上一条命令执行完,退出码为0才会执行下一条命令,否则不执行下一条命令
!:!0返回1,!1返回0
赋值运算符
=、+=、-=、*=、/=、%=
&=、|=、^=、<<=、>>=
按位运算符
分支语句
if语句
1 2 3
| if 布尔表达式 ( 布尔表达式成立时执行的命令 )
|
1 2 3 4 5
| if 布尔表达式 ( 布尔表达式成立时执行的命令 ) else ( 布尔表达式不成立时执行的命令 )
|
1 2 3 4 5
| if 布尔表达式1 ( if 布尔表达式1 ( 布尔表达式1和2都成立时执行的命令 ) )
|
循环语句
for语句
遍历数字序列
1 2 3
| for /l %%i in (起始值,步长,结束值) do ( 布尔表达式成立时反复执行的命令 )
|
遍历元素
1 2 3
| for %%i in (元素1 元素2) do ( 布尔表达式成立时反复执行的命令 )
|
遍历文件和目录
遍历所有匹配的文件名
1 2 3
| for %%i in (*.*) do ( 布尔表达式成立时反复执行的命令 )
|
遍历所有匹配的目录名
1 2 3
| for /d %%i in (*) do ( 布尔表达式成立时反复执行的命令 )
|
遍历所有匹配的目录下的所有文件名
1 2 3
| for /r %%i in (*) do ( 布尔表达式成立时反复执行的命令 )
|
遍历字符串
- 遍历时默认自动清除每一行前导空白字符,默认每行只取第一段(根据空格或制表符分段)
"tokens=1,2":指定读取的段落的编号,编号从1开始,多个编号用,分隔
"delims=":指定段分隔符,缺省值为空格和制表符
"delims= ":指定段落分隔符为空格
遍历字符串
1 2 3
| for /f "tokens=1 delims= " %%i in ("<str>") do ( 布尔表达式成立时反复执行的命令 )
|
遍历文件内的每一行
1 2 3
| for /f %%i in (<file>) do ( 布尔表达式成立时反复执行的命令 )
|
遍历命令输出内容的每一行
1 2 3
| for /f %%i in ('<cmd>') do ( 布尔表达式成立时反复执行的命令 )
|
重定向
输出重定向
覆盖输出
追加输出
输出重定向
文件内容作为stdin
屏蔽输出
屏蔽标准输出
屏蔽错误输出
屏蔽标准输出和错误输出
管道符
暂停程序
终止程序
完成