@符号

“@”用于隐藏命令的具体内容

例如,我们在桌面创建一个test.txt,修改后缀名为.bat,然后使用记事本打开它,在其中输入下面的语句并保存

1
echo 测试命令

打开cmd,在其中输入:

1
2
3
4
5
6
7
8
C:\Users\zerwa>cd desktop

C:\Users\zerwa\Desktop>test

C:\Users\zerwa\Desktop>echo 测试命令
测试命令

C:\Users\zerwa\Desktop>

可以看到,执行test.bat后,紧接着出现了“echo 测试命令”,这就是控制台将命令的具体内容显示出来了。

我们修改test.bat:

1
@echo 测试命令

再在cmd里执行

1
2
3
4
C:\Users\zerwa\Desktop>test
测试命令

C:\Users\zerwa\Desktop>

可以看到,命令的具体内容都被隐藏,只把输出内容“测试命令”显示出来了。

echo off

修改test.bat

1
2
3
4
5
echo 测试命令1
echo 测试命令2
echo 测试命令3
echo 测试命令4
echo 测试命令5

cmd执行test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
C:\Users\zerwa\Desktop>test

C:\Users\zerwa\Desktop>echo 测试命令1
测试命令1

C:\Users\zerwa\Desktop>echo 测试命令2
测试命令2

C:\Users\zerwa\Desktop>echo 测试命令3
测试命令3

C:\Users\zerwa\Desktop>echo 测试命令4
测试命令4

C:\Users\zerwa\Desktop>echo 测试命令5
测试命令5

C:\Users\zerwa\Desktop>

修改test.bat

1
2
3
4
5
6
echo off
echo 测试命令1
echo 测试命令2
echo 测试命令3
echo 测试命令4
echo 测试命令5

cmd执行test

1
2
3
4
5
6
7
8
9
10
C:\Users\zerwa\Desktop>test

C:\Users\zerwa\Desktop>echo off
测试命令1
测试命令2
测试命令3
测试命令4
测试命令5

C:\Users\zerwa\Desktop>

可以看到,echo off也可以让命令隐藏,只进行输出。

我们配合@符号

1
2
3
4
5
6
@echo off
echo 测试命令1
echo 测试命令2
echo 测试命令3
echo 测试命令4
echo 测试命令5
1
2
3
4
5
6
7
8
C:\Users\zerwa\Desktop>test
测试命令1
测试命令2
测试命令3
测试命令4
测试命令5

C:\Users\zerwa\Desktop>

pause

1
2
3
4
5
6
7
8
9
10
@echo off
echo 测试命令1
echo 测试命令2
echo 测试命令3
echo 测试命令4
echo 测试命令5
pause
echo 测试命令6
echo 测试命令7
echo 测试命令8
1
2
3
4
5
6
7
8
9
10
11
12
C:\Users\zerwa\Desktop>test
测试命令1
测试命令2
测试命令3
测试命令4
测试命令5
请按任意键继续...
测试命令6
测试命令7
测试命令8

C:\Users\zerwa\Desktop>

bat窗口

修改test.bat

1
2
3
4
5
6
@echo off
chcp 65001
title test bat
color 03
mode con cols=50 lines=50
pause

title,bat窗口的标题

chcp 65001使用UTF-8,防止窗口中文乱码。如果不想乱码,可以让文本编辑器使用ANSI编码

color,bat背景颜色和字体颜色,两位数字组成,第一位是背景颜色,第二位是字体颜色,这里“03”代表的是背景颜色黑色,字体颜色湖蓝色

1
0=黑、1=蓝、2=绿、3=湖蓝色、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白

mode con cols=50 lines=50,可以理解为窗口大小,宽度cols为50,高低lines为50

文件写入

在命令行当中要进行文件写入,需要执行echo (内容) >> (文件),表示 从文件流的末尾开始写入

修改test.bat

1
2
3
4
5
6
7
8
9
10
@echo off
chcp 65001
title test bat
color 03
mode con cols=50 lines=50

e:
cd e:\work
echo bat测试命令 >> 测试2.txt
pause

进入E盘——进入E:\Work文件夹——向测试2.txt文件的末尾写入“bat测试命令”

如果想覆盖写入,使用一个>即可

type

使用type,显示当前文件夹内指定文件的内容(指文本文件)

修改test.bat

1
2
3
4
5
6
7
8
9
10
@echo off
chcp 65001
title test bat
color 03
mode con cols=50 lines=50

e:
cd e:\work
type 测试2.txt
pause

find

使用find,按照指定的条件显示文件的内容

修改test.bat

1
2
3
4
5
6
7
8
9
10
@echo off
chcp 65001
title test bat
color 03
mode con cols=50 lines=50

e:
cd e:\work
find /N/I "测试" 测试2.txt
pause

/N表示显示行号,/I表示忽略大小写,"测试"是指定的文本内容

测试结果:

1
2
3
__________测试2.TXT
[1]bat测试命令
请按任意键继续...

会完整显示包含“测试”这个词的一整行内容,前面的[1]就是行号

findstr

findstr是一个类似的命令,功能更多,可以通过/?来了解

参数%

使用%1 - %9来为命令行指定参数

修改test.bat

1
2
3
4
5
6
7
8
9
10
@echo off
chcp 65001
title test bat
color 03
mode con cols=50 lines=50

e:
cd e:\work
echo %1% >> 测试2.txt
pause

这里%1%使用两个百分号表示取值

在cmd里执行

1
C:\Users\zerwa\Desktop>test 写入参数测试

这时“测试2.txt”文件内会添加上“写入参数测试”一行字

注释 rem

rem注释一行命令

1
rem echo %1% >> 测试2.txt

if goto exit

修改test.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
chcp 65001
title test bat
color 03
mode con cols=50 lines=50

if "%1" == "qwer" goto A
echo 参数不等于qwer
pause
exit
:A
echo 参数等于qwer
pause

if条件判断,这里使用双引号表示判断输入的字符

goto跳转

:A后面接跳转的命令

exit退出

这里如果不退出的话,如果我们输入的字符不是“qwer”,后面的“参数等于qwer”依然会输出

if else

修改test.bat

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
chcp 65001
title test bat
color 03
mode con cols=50 lines=50

if "%1" == "qwer" (
echo 包含qwer
) else (
echo 不包含qwer
)
pause

echo命令必须在每一行的开头

if "%1" == "qwer" (中的"qwer"(必须要有空格

) else (中的else和前后括号必须要有空格

必须严格按照上面的格式,左括号(必须跟在条件语句后面,不能单独占一行

判断参数是否为空

修改test.bat

1
2
3
4
5
6
7
8
9
10
@echo off
chcp 65001
title test bat
color 03
mode con cols=50 lines=50

if {%1}=={} goto A
:A
echo 没有参数
pause

exist

判断某个文件是否存在

1
2
3
4
5
6
7
8
@echo off
if exist 学习笔记.txt goto A
echo 不存在
pause
exit
:A
echo 存在
pause

call

调用其他的bat或者拓展名为.cmd的文件

1
2
3
4
@echo off
echo 调用tt
call tt2
pause

start

启动一个程序,exe或者bat,和call不同的是,这里有“启动”这个操作

1
2
3
4
@echo off
echo 调用程序
call "E:\Star Rail\launcher.exe"
pause

choice

在命令行中提供选项,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
choice /c ync /m "确认Y,否N,取消C。"
if errorlevel 3 goto C
if errorlevel 2 goto N
if errorlevel 1 goto Y

:Y
echo 确定
goto C

:N
echo 否
goto C

:C
echo 取消

pause

/c后面跟选项,每一个字母代表一个选项,这里有ync三个选项

/m后面跟文字提示

errorlevel表示choice返回的值,用数字表示,数字的大小跟ync的顺序有关

if判定errorlevel,不用等于号

for循环

cmd窗口里,for循环的格式是for %i in (command1) do command2

bat里,for循环的格式是for %%i in (command1) do command2,引用变量多加了一个百分号。

%i就相当于程序里面的i,在这里尽量使用i%j%k%等字母,%1-%9一般都是用于参数的引用

变量名称区分大小写,%i 不等于%I

command1就是需要取出变量的地方,比如说用空格分割的字符串,注意整个command必须在括号内

command1的形式有三种

(file-set),也就是文本文件,括号内写明文件

("string"),字符串,括号内再用双引号括起来

('command'),普通命令,比如('echo ATAO')

command2就是每取出一个变脸所做的事情,在do的后面

示例1:

在命令行中

1
2
3
4
5
6
7
C:\Users\zerwa\Desktop>for %i in (a b c) do echo %i
C:\Users\zerwa\Desktop>echo a
a
C:\Users\zerwa\Desktop>echo b
b
C:\Users\zerwa\Desktop>echo c
c

在command1内,元素可以用空格、逗号、等号来分隔,如(a,b,c)(a=b=c)

/L

/L表示Command1中使用开关控制循环次数。for /L %i in (start,step,end) do command2

示例2(在命令行中):

1
2
3
4
5
6
7
8
9
10
11
C:\Users\zerwa\Desktop>for /L %i in (1,2,10) do echo %i
C:\Users\zerwa\Desktop>echo 1
1
C:\Users\zerwa\Desktop>echo 3
3
C:\Users\zerwa\Desktop>echo 5
5
C:\Users\zerwa\Desktop>echo 7
7
C:\Users\zerwa\Desktop>echo 9
9

/F

/F可以帮助我们遍历文件(文本文件),如果没有指定分割符,/F会将文本文件内的每个空格作为分割符,并单独处理每一行空格之前的字符。

不过我们可以自己指定分割符,这样整个文本文件所有的内容都可以得到显示。

示例3(在bat中):

1
2
@echo off
for /F "delims=;" %%i in (测试文本.txt) do echo %%i

"delims=;"表示指定分号为分隔符,这里的指令在双引号之间输入

示例3相当于type命令

示例4,我们在测试文本中写入:

1
2
3
一 二 三
四 五 六
七 八 九

在bat中:

1
2
@echo off
for /F "tokens=2 delims=" %%i in (测试文本.txt) do echo %%i

tokens=2指的是获取文本文件中每一行分隔后索引为2的值,这里我们的delims默认为空格

输出的值:

1
2
3
4
C:\Users\zerwa\Desktop>test



我们也可以输出多个索引

在bat中:

1
2
@echo off
for /F "tokens=1,2,3 delims=" %%i in (测试文本.txt) do echo %%i %%j %%k

我们添加了多少个tokens,后面就必须跟多少个引用变量(%%i %%j %%k)否则还是不会全部输出。这里%%i %%j %%k也要按照字母的排序

注意前面的%%i表示的是测试文本的引用变量,并不是输出变量,所以只有一个。

输出的值:

1
2
3
4
C:\Users\zerwa\Desktop>test
一 二 三
四 五 六
七 八 九

当然,tokens也可以使用通配符,把所有的字符都作为参数输出

1
2
@echo off
for /F "tokens=* delims=" %%i in (测试文本.txt) do echo %%i

使用skip参数,代表忽略几行

1
2
@echo off
for /F "skip=2 tokens=* delims=" %%i in (测试文本.txt) do echo %%i

输出的值:

1
七 八 九

使用eol参数,代表忽略以指定的单个字符开始的行

1
2
@echo off
for /F "eol=四 tokens=* delims=" %%i in (测试文本.txt) do echo %%i

输出的值:

1
2
一 二 三
七 八 九

使用usebackq参数,也就是转义字符“\”

1
2
@echo off
for /F "usebackq tokens=* delims=" %%i in ("测试文本.txt") do echo %%i

如果我们没有使用usebackq("测试文本.txt")里面的内容会被认为是字符串;如果使用了usebackq("测试文本.txt")里面的内容会被认为是一个文件

1
2
@echo off
for /F "usebackq tokens=* delims=" %%i in ('echo ATAO') do echo %%i

如果我们没有使用usebackq('echo ATAO')里面的内容会被认为是一个命令;如果使用了usebackq('echo ATAO')里面的内容会被认为是一个字符串

date、time

在cmd中输入

1
2
3
C:\Users\zerwa\Desktop>date
当前日期: 2023/07/09 周日
输入新日期: (年月日)

如果想要单独获得年月日

1
2
3
4
5
6
C:\Users\zerwa\Desktop>echo %date:~0,4%
2023
C:\Users\zerwa\Desktop>echo %date:~5,2%
07
C:\Users\zerwa\Desktop>echo %date:~8,2%
09

%date:~0,4%,前后两个百分号表示取值,中间的冒号波浪号为固定写法,0表示从第0个光标位置开始(也就是2023/07/09 周日2023前面那个光标位置),4表示向后数4位,在第四位光标之前的内容都被输出出来,也就是2023

在cmd中输入

1
2
3
C:\Users\zerwa\Desktop>time
当前时间: 17:11:46.62
输入新时间:

如果想要单独获得时分秒

1
2
3
4
5
6
C:\Users\zerwa\Desktop>echo %time:~0,2%
17
C:\Users\zerwa\Desktop>echo %time:~3,2%
11
C:\Users\zerwa\Desktop>echo %time:~6,2%
46

set 赋值

在bat中输入

1
2
3
4
@echo off
set t=%time:~0,2%
echo %t%
pause

字符串操作

裁剪

1
2
3
4
5
@echo off
chcp 65001
set t="ATAO2017"
echo %t:~1,2%
pause

和之前的date、time一样,基于裁剪

替换

在bat中输入

1
2
3
4
5
6
@echo off
chcp 65001
set t="ATAO2017"
echo 替换前:%t%
echo 替换后:%t:2017=2023%
pause

输出

1
2
替换前ATAO2017
替换后ATAO2023

在上面的例子中,t这个变量并没有被赋值,所以并没有真正的“替换”

1
2
3
4
5
6
7
8
@echo off
chcp 65001
set t="ATAO2017"
echo 替换前:%t%
echo 替换后:%t:2017=2023%
set "t=%t:2017=2023%"
echo %t%
pause

t重新set一遍,才能真正替换,这里"t=%t:2017=2023%"经测试加不加引号都可以

拼接

1
2
3
4
5
6
7
@echo off
chcp 65001
set t="ATAO2017"
set t2="Wahaha"
set "t3=%t%%t2%"
echo %t3%
pause

tt2不加引号也是可以的

扩充

用于处理路径,对输入的路径进行处理

假如我们的输入参数为%0

1
2
3
4
5
6
7
8
9
10
11
~0 -删除任何引号("),扩充%0
%~f0 -将%0扩充到一个完全合格的路径名(“f”是file,即文件)
%~d0 -仅将%0扩充到一个驱动器号
%~p0 -仅将%0扩充到一个路径
%~n0 -仅将%0扩充到一个文件名(“n”是name文件名)
%~x0 -仅将%0扩充到一个文件扩展名
%~s0 -扩充的路径只含有短名(“s”为Short,短的)
%~a0 -将%0扩充到文件的文件属性(“a”为attribute,即属性)
%~t0 -将%0扩充到文件的日期/时间(“t”time)
%~z0 -将%0扩充到文件的大小(Size大小)
%~$PATH:0 -查找列在路径环境变量的目录,并将%0扩充

示例

修改bat

1
2
3
@echo off
echo %~pd1
pause

%~p1表示\wamp\

%~d1表示C:

将两者合起来就是下面这个输出

输出

1
2
3
C:\Users\zerwa\Desktop>test C:\wamp\wampmanager
C:\wamp\
请按任意键继续. . .

修改bat

1
2
3
@echo off
echo %~nx1
pause

%~n1表示输出文件名

%~x1表示输出文件拓展名

1
2
3
C:\Users\zerwa\Desktop>test C:\wamp\wampmanager
wampmanager.exe
请按任意键继续. . .