【笔记】CMD学习笔记

前言

Windows命令提示符(cmd.exe)是Windows NT下的一个用于运行Windows控制台程序或某些DOS程序的壳层程序;或在Windows CE下只用于运行控制台程序的壳层程序。它被用于替代Windows 9x系统中所提供的COMMAND.COM和“MS-DOS提示符”。命令提示符的最初版本由Therese Stowell开发。(维基百科

运行脚本

  • .bat脚本是旧版脚本,遇到报错的命令会继续后续命令执行
  • .bat脚本保留了非常老旧的DOS兼容逻辑
  • .bat脚本使用部分高级语法扩展时需要先手动开启setlocal enabledelayedexpansion
1
.\<file>.bat
  • .cmd脚本是新版脚本,遇到报错的命令会终止后续命令执行
  • .cmd脚本淘汰了非常老旧的DOS兼容逻辑
  • .cmd脚本默认支持高级语法扩展
1
.\<file>.cmd

关闭所有命令回显

1
@echo off

关闭当前命令回显

1
@命令

注释

  • ::定义的注释不能放在其他命令末尾,会被当作命令参数
1
:: 注释内容
  • rem定义的注释可以放在其他命令末尾
1
rem 注释内容

输出语句

1
echo 文本内容

变量

系统内置变量

变量
%0 当前命令名
%1%2、…、%9 第1个参数、第2个参数、…第9个参数
%* 将所有参数不保留中间空格拼接为一个字符串
%cd% 当前工作目录
%date% 当前日期
%time% 当前时间
%errorlevel% 上一条命令退出返回的状态码
%%i for循环的临时变量

定义变量

  • 等号左右不能包含空格
  • 值不可以用双引号包裹,否则双引号会被当作值
1
set 变量名=值

获取变量

1
%变量名%

运算符

  • CMD中的运算符只能在特定命令中使用

算数运算符

  • +(正号)、-(负号)
  • +(加号)、-(减号)、*/%%(取余)
  • ++(自增)、--(自减)
1
set /a 变量名=10+3
1
set /a 变量名++
1
set /a ++变量名

关系运算符

  • GTR(大于)、LSS(小于)、GEQ(大于等于)、LEQ(小于等于)、EQU(等于)、NEQ(不等于)
  • ==(字符串等于)
  • exist(文件存在)、not exist(文件不存在)
1
if 10 EQU 3 <cmd>
1
if 10 == 3 <cmd>
1
if exist "<dir_or_file>" <cmd>

逻辑运算符

&&:上一条命令执行完,退出码为0才会执行下一条命令,否则不执行下一条命令

1
<cmd_1> && <cmd_2>

&:上一条执行完,结果无论成功或是失败都会执行下一条命令

1
<cmd_1> & <cmd_2>

||:上一条命令执行完,退出码为0才会执行下一条命令,否则不执行下一条命令

1
<cmd_1> || <cmd_2>

!!0返回1,!1返回0

1
set /a "变量名=!0"

赋值运算符

  • =+=-=*=/=%=
  • &=|=^=<<=>>=
1
set /a "变量名+=10"

按位运算符

  • &|^~<<>>
1
set /a "变量名=10&3"

分支语句

if语句

1
2
3
if 布尔表达式 (
布尔表达式成立时执行的命令
)
1
2
3
4
5
if 布尔表达式 (
布尔表达式成立时执行的命令
) else (
布尔表达式不成立时执行的命令
)
1
2
3
4
5
if 布尔表达式1 (
if 布尔表达式1 (
布尔表达式12都成立时执行的命令
)
)

循环语句

for语句

  • 在命令中可以通过%%i获取当前遍历的数据

遍历数字序列

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 (
布尔表达式成立时反复执行的命令
)

重定向

输出重定向

  • 将命令执行结果输出到文件

覆盖输出

1
<cmd> > <file>

追加输出

1
<cmd> >> <file>

输出重定向

文件内容作为stdin

1
<cmd> < <file>

屏蔽输出

屏蔽标准输出

1
<cmd> >nul

屏蔽错误输出

1
<cmd> 2>nul

屏蔽标准输出和错误输出

1
<cmd> >nul 2>&1

管道符

  • 前面命令的输出作为后面命令的输入
1
<cmd_1> | <cmd_2>

暂停程序

1
pause
1
请按任意键继续. . . 

终止程序

1
exit 0

完成