启动
win + r,输入 cmd 或 cmd.exe,然后按回车,默认进入当前用户路径下的cmd
在文件路径栏里输入cmd,可以直接跳到当前路径下的cmd
命令
说明
-
不区分大小写
-
cmd中运行可执行文件(exe txt md等),可以不加后缀
-
通过向上键和向下键来浏览之前运行过的命令
-
Tab键可以自动补全(支持文件或文件名自动补全)
-
使用
/?
可以查看命令用法,例如:dir /? -
命令基本格式
命令 参数列表
,命令用法中的[]
代表可选 -
ctrl + c:强行中止
windows 路径分隔符:\
Linux 路径分隔符:/
当前目录:.
上一级目录:..
常用命令
命令 | 功能 | |
---|---|---|
dir | 显示文件夹中的文件 | dir /a |
tree | 显示文件夹树形结构 | tree /f |
盘符: | 进入指定磁盘 | c: d: |
cd | 切换目录 | cd test cd .. |
mkdir 或md | 创建目录 | mkdir test |
rmdir 或 rd | 删除目录 | rmdir test |
del | 删除文件 | del 1.txt del /q/a/f *.txt |
rename 或 ren | 重命名 | rename a.txt b.txt |
copy | 复制文件到某个路径下 | copy a\1.txt b\1.txt |
copy 1.txt a | ||
路径默认前缀为当前路径(即cmd显示的路径) | ||
复制的同时可以重命名和指定目标路径 | ||
move | 移动文件并重命名 | move 1.txt a\1.txt |
命令 | 功能 | |
---|---|---|
echo | 显示 | echo hello world |
pause | 暂停 | 请按任意键继续. . . |
cls | 清屏 | |
exit | 退出 | |
type | 显示文件内容 | type test.txt |
find | 查找文件中的字符串 | find “abc” test.txt |
fc | 逐行比较文件内容 | fc 1.txt 2.txt |
date | 显示/修改日期 | |
time | 显示/修改时间 | |
ping | 网络连接测试 | ping www.baidu.com |
ipconfig | 显示网络配置信息 | |
shutdown | 关机 | shutdown /s /t 60(60s 后关机) |
shutdown /a(取消关机) |
多命令
& | 从左至右执行命令,不管命令是否执行失败 |
abc & dir | |
&& | 从左至右执行命令,前面的命令执行失败则不执行后面的命令 |
abc && dir | |
|| | 从左至右执行命令,碰到执行正确的命令后将不执行后面的命令 |
abc || dir || bcd |
重定向操作符
与Unix/Linux 一样,DOS使用三个通用的“文件流”来进行输入,输出文本信息或者错误信息。
程序或者脚本使用
标准输入文件(stdin)读取内容,
标准输出(stdout)输出文件或者打印文本到屏幕上,
标准错误(stderr)输出错误信息到屏幕上。
> | 将左边 命令/程序 结果输入到右边文件中 |
---|
例:
echo hello > tmp.txt
会覆盖文件中原有内容
>> | 将左边 命令/程序 结果追加输入到右边文件中 |
---|
例:
echo hello > tmp.txt
echo world > tmp.txt
不会覆盖文件中原有内容
另起一行追加
默认情况下,>
、>>
是将标准输出重定向。 也可以在操作符前加上 2
(注意没有空格) 来重定向标准错误。
2> | 若左边 命令/程序 执行失败,则将其中失败结果输入到右边文件中 |
---|---|
若左边 命令/程序 执行成功,则不将结果输入到右边文件中 | |
2>> | 追加 |
1>&2 | 看不懂,妈的 |
2>&1 | 看不懂,妈的 |
例
test.cmd
@echo off
echo hello
somecommond
pause
test.cmd > tmp.txt
将 test.cmd 程序执行后的成功结果输入到 tmp.txt
test.cmd 2> tmp.txt
将 test.cmd 程序执行后的失败结果输入到 tmp.txt
< | 将右边文件的内容作为左边命令的输入 |
---|
例:
sort < tmp.txt
tmp.txt
3
2
4
1
管道符
| | 将左边命令的输出作为右边命令的输入 |
---|
例
dir | sort
dir | find "txt"
其他
NUL
是一个虚拟的设备(文件),将 stdout
重定向到 NUL
,则会丢弃标准输出。
例
pause > nul
dir > nul
批处理
在Windows操作系统中,批处理指的是批处理文件(Batch File),这是一种包含一系列命令的脚本文件,这些命令可以自动执行,无需用户逐个输入。批处理文件通常用于自动化常规的、重复性的任务,比如文件操作、程序执行、系统配置等。
扩展名与文件命名
扩展名
.bat 是最常用的扩展名,用于传统的批处理文件。
.cmd 是较新的扩展名,用于Windows NT命令脚本,它提供了一些额外的功能和改进。
两者都可以被Windows命令解释器(cmd.exe)执行,
但在某些情况下,.cmd 脚本可能提供更好的性能和额外的命
不过,在日常使用中,.bat 和 .cmd 文件之间的差异对大多数用户来说是不明显的。
在cmd命令行中编写命令和在批处理文件中编写命令会有些语法上的不同,后面会提到
文件命名
1-文件名中避免使用空格,使用 Pascal 命名法则来命名
例如: HelloWorld.cmd 代替 Hello World.cmd
2-可以使用标点符号,比如 . 或者 -
例如: Hello.World.cmd, Hello-world.cmd, Hello_World.cmd
3-避免与系统内置的命令或者一些常用的软件相同。
例如,避免使用 ping.cmd,因为系统中有个 ping.exe的可执行文件。如果运行ping命令,你想要运行的是 ping.cmd, 但可能调用的是 ping.exe
运行方式
- 双击运行
- 在cmd中运行(可以传参)
基本结构
批处理文件的编写非常简单,下面是一个简单的例子:
@echo off
echo Hello, this is a batch file.
pause
@echo off
:关闭命令回显,即不显示执行的命令。
批处理文件中的第一个非注释行,通常是一条关闭输出的命令。
@ECHO OFF
@
是一个特殊的操作符,用于抑制命令行的打印。
一旦我们关闭了输出,在后续的脚本命令中就不再需要 @
操作符了。
可以使用以下命令恢复打印:
ECHO ON
当脚本退出时,命令提示符会自动将ECHO恢复到它以前的状态。
echo Hello, this is a batch file.
:在命令提示符下显示文本。pause
:暂停执行,等待用户按任意键继续。
这个结构不是固定的
没有pause,直接双击运行bat,窗口会一闪而过
没有@echo off,每运行一条脚本中的命令,都会显示cmd的路径,即>前的路径
通常在cmd中运行脚本时,我喜欢把 pause 去掉
注释
::this is a line of comment
rem this is a line of comment
大多数的高级开发者发现, ::
相比 REM
能减少注意力分散,但是在有些地方 ::
会导致错误。
比如,一个 for 循环中使用 ::
就会导致错误。
如果出现这种情况,只需要换回 REM
即可。
变量
赋值
使用 SET
命令为一个变量赋值
SET foo=bar
注意
不要在名称和值之间使用空格
错误写法: SET foo = bar
正确写法: SET foo=bar
1 | set var=student | var=student |
2 | set var= student | var= student |
3 | set var = student | var = student |
注意空格!
1和2 变量名一样,值不一样
2和3 变量名不一样,值不一样
所以还是写成:
set var=student
可通过set命令验证
自定义变量名一般是小写
系统变量一般是大写
使用
在大多数情况下,可以通过 %
运算符将变量名括起来读取变量值。
SET var=123
ECHO %var%
扩展
/A
支持算数操作
set /a var=2+3*2
echo %var%
输出结果:8
试比较
set var=2+3*2
echo %var%
输出结果:2+3*2
注意
通过set
命令在CMD会话中设置的环境变量只会在当前会话中有效,关闭CMD窗口后这些变量就会消失。而通过系统属性或控制面板设置的环境变量是持久的,会影响到所有新的进程和用户会话。
SET
会覆盖任何现有变量
在使用前,先验证下是否会覆盖系统变量
ECHO %foo%
可以确认 foo
是不是一个现有的变量。
如果 cmd 输出结果为 %foo%
,说明不是一个现有变量,可以放心使用
使用 set
可以查看当前定义好的变量(set temp)
不过有些变量已定义却不会显示
例如:
%CD%
- 当前目录字符串。
%DATE%
- 用跟 DATE 命令同样的格式扩展到当前日期。
%TIME%
- 用跟 TIME 命令同样的格式扩展到当前时间。
%RANDOM%
- 0 和 32767 之间的任意十进制数字。
%ERRORLEVEL%
- 当前 ERRORLEVEL 数值。
%CMDEXTVERSION%
- 当前命令处理器扩展版本号。
%CMDCMDLINE%
- 调用命令处理器的原始命令行。
%HIGHESTNUMANODENUMBER%
- 此计算机上的最高 NUMA 节点号。
%0
、%1
、%2
…… - 命令行参数。%0
表示命令名,在cmd运行该bat时,bat文件名即为%0,之后即%1 %2 … 即代表之后输入的参数,参数间按空格分开
命令行中输入 echo %cd% 查看当前目录字符串
返回值
变量 %ERRORLEVEL%
存储了上一次命令运行后返回的代码
通常情况下,命令行程序执行成功会返回 0 ,执行错误会返回非0的数字
条件
if [not] 条件 (语句块
) else (语句块
)
请注意小括号和各个空格的位置
也可以写在一行
例1:
@echo off
set var=a
if a == b (echo true) else (echo false)
if a == %var% (
echo true
) else (
echo false
)
pause
例2(扩展):
@echo off
if exist demo1.bat (echo true) else (echo false)
if /i abc == ABC (echo true) else (echo false)
if /i B gtr a (echo true) else (echo false)
pause
/i | 比较 |
---|---|
忽略大小写 | |
equ | 等于 |
neq | 不等于 |
lss | 小于 |
leq | 小于等于 |
gtr | 大于 |
geq | 大于等于 |
请注意,if
语句在批处理文件中使用单个百分号(%
),而在命令提示符直接使用时,需要使用双百分号(%%
)来表示变量。
跳转
goto labelName # 跳转到标签所在行
:label # 标签以冒号开头
例:
@echo off
goto l1
echo hello
:l1
echo world
pause
还有一个 call 语句,作用和 goto 有点类似
主要区别:
- 跳转与返回:
goto
是单向的跳转,不会返回;而call
是双向的,执行完毕后会返回。 - 跨文件能力:
call
可以调用其他文件,而goto
只能在当前文件内跳转。 - 参数传递:
call
可以传递参数给被调用的程序或标签,goto
则不能
循环
for %%i in (set) do (语句块
)
循环变量用 %% 指定,只能是单字母,区分大小写
set 表示文件集合(也可以是空文件),元素之间以逗号或空格分隔,支持通配符
? # 单个字符
* # 任意字符
例:
@echo off
echo --for example 1--
for %%i in (a,b,c) do (echo %%i)
echo --for example 2--
for %%i in (*.*) do (echo %%i)
pause
example 1:
逐个打印 a b c
example 2:
打印当前目录下所有后缀的所有文件
写成如下形式亦可
for %%i in (*) do (echo %%i)
例:
@echo off
echo --for example 3--
for %%i in (*.bat) do (echo bat file: %%i
)
echo --for example 4--
for /d %%i in (*) do (echo %%i
)
echo --for example 5--
for %%i in (C:\Users\feini\Desktop\202412_cmd\*) do (echo %%i
)
echo --for example 6--
for /r C:\Users\feini\Desktop\202412_cmd /d %%i in (*) do (echo %%i
)
pause
example 3:
遍历当前目录下的所有后缀为bat的文件
example 4:
遍历当前目录下的所有文件夹
example 5:
遍历指定目录下的所有文件
example 6
递归遍历指定目录及其子目录下的所有文件夹
例:
@echo off
for /l %%i in (1, 3, 11) do (echo Number: %%i
)
pause
从1开始输出,每次递增3,直到11
在cmd中输入以下语句是错误的
for %%i in (a,b,c) do (echo %%i)
请注意,在命令行中使用 for
循环时,变量使用单个百分号 %
而不是批处理文件中的双百分号 %%
。这是因为在命令行中,单个百分号用于表示单个命令的变量,而在批处理文件中,双百分号用于表示整个批处理文件中的变量。
可以在cmd中输入for /? 查看说明
进阶
环境变量
环境变量PATH
定义了操作系统在执行命令时搜索可执行文件的目录。当用户在CMD中输入一个命令时,系统会按照PATH
环境变量中列出的目录顺序去查找对应的可执行文件。
setlocal
在Windows命令提示符(cmd)和批处理文件中,setlocal
是一个命令,用于开始一个新的本地环境块。在setlocal
命令之后的命令会在这个局部环境中执行,这意味着在这个块中所做的任何环境变量的更改都不会影响全局环境。
功能
- 环境变量限制:在
setlocal
和对应的endlocal
之间设置的环境变量或所做的更改,仅在这两个命令之间的脚本部分有效。 - 错误处理:如果在
setlocal
和endlocal
之间发生错误,endlocal
会尝试恢复环境到setlocal
执行前的状态。 - 子进程隔离:在
setlocal
和endlocal
之间启动的任何子进程(如调用的其他批处理文件或程序)不会继承这些局部环境变量。
语法
cmd
setlocal [选项]
-
选项
:
/a
:设置或清除变量时不区分大小写。-enableDelayedExpansion
:启用延迟变量扩展。-disableDelayedExpansion
:禁用延迟变量扩展。-enableExtensions
:启用命令扩展。-disableExtensions
:禁用命令扩展。
示例
cmd
@echo off
setlocal
set myVar=This is a local variable
echo %myVar%
endlocal
echo %myVar% ; 这将显示 nothing,因为 myVar 只在 setlocal 和 endlocal 之间有效
在这个例子中,myVar
环境变量只在setlocal
和endlocal
之间的局部环境中有效。一旦执行到endlocal
,myVar
就不再存在于环境变量中。
用途
- 临时更改环境:当你需要临时更改环境变量,而不影响全局环境时。
- 编写脚本:在编写批处理脚本时,使用
setlocal
和endlocal
可以帮助管理环境变量,避免脚本间的干扰。 - 调试和测试:在调试和测试时,可以局部地更改环境变量,以便测试不同的配置,而不会影响系统的全局设置。
setlocal
是一个强大的工具,可以帮助你控制批处理脚本中的环境变量,使脚本更加灵活和安全。
延迟变量
@echo off
set num=1
for %%i in (1 2 3) do (set /a num=num+1echo %num%
)
echo %num%
pause
@echo off
setlocal enabledelayedexpansionset num=0
for %%i in (1 2 3) do (set /a num=num+1echo !num!
)
echo %num%endlocalpause
注意,随着endlocal语句位置的变化,num的值也会发生变化
批量修改文件名
@echo off
setlocal enabledelayedexpansionset cnt=1for %%f in (*.txt) do (rename %%f !cnt!.txtset /a cnt=!cnt! + 1
)
endlocalpause
https://blog.csdn.net/hfy1237/article/details/130123285
https://blog.51cto.com/u_15170706/6308452
https://blog.csdn.net/Dandelion_gong/article/details/78067501
命令全称
CMD中的命令通常有缩写形式和全称形式,以下是一些常用命令及其全称:
- dir - directory:列出目录内容。
- cd - change directory:改变当前目录。
- mkdir 或 md - make directory:创建新目录。
- rmdir 或 rd - remove directory:删除目录。
- del 或 delete - delete file:删除文件。
- ren 或 rename - rename file:重命名文件。
- cls - clear screen:清除屏幕。
- ipconfig - IP configuration:显示TCP/IP配置信息。
- ping - packet internet groper:发送ICMP ECHO_REQUEST到网络主机。
- netstat - network statistics:显示网络连接、路由表、接口统计等。
- systeminfo - system information:显示本地或远程主机的详细配置信息。
- tasklist - list tasks:显示运行中的进程列表。
- taskkill - kill task:结束或杀掉一个进程。
- shutdown - shutdown system:关闭或重启计算机。
请注意,有些命令可能没有官方的全称,因为它们本身就是缩写,或者是为了简便而设计的。在实际使用中,用户通常使用缩写形式,因为它们更短、更快捷。
参考资料
https://www.jianshu.com/p/dbb7b13c5ed8
https://www.bilibili.com/video/BV12T411Z716