批处理
@符号
“@”用于隐藏命令的具体内容
例如,我们在桌面创建一个test.txt,修改后缀名为.bat,然后使用记事本打开它,在其中输入下面的语句并保存
1 | echo 测试命令 |
打开cmd,在其中输入:
1 | C:\Users\zerwa>cd desktop |
可以看到,执行test.bat后,紧接着出现了“echo 测试命令”,这就是控制台将命令的具体内容显示出来了。
我们修改test.bat:
1 | @echo 测试命令 |
再在cmd里执行
1 | C:\Users\zerwa\Desktop>test |
可以看到,命令的具体内容都被隐藏,只把输出内容“测试命令”显示出来了。
echo off
修改test.bat
1 | echo 测试命令1 |
cmd执行test
1 | C:\Users\zerwa\Desktop>test |
修改test.bat
1 | echo off |
cmd执行test
1 | C:\Users\zerwa\Desktop>test |
可以看到,echo off也可以让命令隐藏,只进行输出。
我们配合@符号
1 | @echo off |
1 | C:\Users\zerwa\Desktop>test |
pause
1 | @echo off |
1 | C:\Users\zerwa\Desktop>test |
bat窗口
修改test.bat
1 | @echo off |
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 | @echo off |
进入E盘——进入E:\Work文件夹——向测试2.txt文件的末尾写入“bat测试命令”
如果想覆盖写入,使用一个
>
即可
type
使用type
,显示当前文件夹内指定文件的内容(指文本文件)
修改test.bat
1 | @echo off |
find
使用find,按照指定的条件显示文件的内容
修改test.bat
1 | @echo off |
/N
表示显示行号,/I
表示忽略大小写,"测试"
是指定的文本内容
测试结果:
1 | __________测试2.TXT |
会完整显示包含
“测试”
这个词的一整行内容,前面的[1]
就是行号
findstr
findstr是一个类似的命令,功能更多,可以通过/?
来了解
参数%
使用%1 - %9
来为命令行指定参数
修改test.bat
1 | @echo off |
这里
%1%
使用两个百分号表示取值
在cmd里执行
1 | C:\Users\zerwa\Desktop>test 写入参数测试 |
这时“测试2.txt”文件内会添加上“写入参数测试”一行字
注释 rem
rem注释一行命令
1 | rem echo %1% >> 测试2.txt |
if goto exit
修改test.bat
1 | @echo off |
if
条件判断,这里使用双引号表示判断输入的字符
goto
跳转
:A
后面接跳转的命令exit退出
这里如果不退出的话,如果我们输入的字符不是“qwer”,后面的“参数等于qwer”依然会输出
if else
修改test.bat
1 | @echo off |
echo命令必须在每一行的开头
if "%1" == "qwer" (
中的"qwer"
和(
必须要有空格
) else (
中的else
和前后括号必须要有空格必须严格按照上面的格式,左括号
(
必须跟在条件语句后面,不能单独占一行
判断参数是否为空
修改test.bat
1 | @echo off |
exist
判断某个文件是否存在
1 | @echo off |
call
调用其他的bat或者拓展名为.cmd的文件
1 | @echo off |
start
启动一个程序,exe或者bat,和call不同的是,这里有“启动”这个操作
1 | @echo off |
choice
在命令行中提供选项,
1 | @echo off |
/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 | C:\Users\zerwa\Desktop>for %i in (a b c) do echo %i |
在command1内,元素可以用空格、逗号、等号来分隔,如
(a,b,c)
、(a=b=c)
/L
/L
表示Command1中使用开关控制循环次数。for /L %i in (start,step,end) do command2
示例2(在命令行中):
1 | C:\Users\zerwa\Desktop>for /L %i in (1,2,10) do echo %i |
/F
/F可以帮助我们遍历文件(文本文件),如果没有指定分割符,/F会将文本文件内的每个空格作为分割符,并单独处理每一行空格之前的字符。
不过我们可以自己指定分割符,这样整个文本文件所有的内容都可以得到显示。
示例3(在bat中):
1 | @echo off |
"delims=;"
表示指定分号为分隔符,这里的指令在双引号之间输入示例3相当于
type
命令
示例4,我们在测试文本中写入:
1 | 一 二 三 |
在bat中:
1 | @echo off |
tokens=2指的是获取文本文件中每一行分隔后索引为2的值,这里我们的delims默认为空格
输出的值:
1 | C:\Users\zerwa\Desktop>test |
我们也可以输出多个索引
在bat中:
1 | @echo off |
我们添加了多少个tokens,后面就必须跟多少个引用变量(
%%i %%j %%k
)否则还是不会全部输出。这里%%i %%j %%k
也要按照字母的排序注意前面的
%%i
表示的是测试文本的引用变量,并不是输出变量,所以只有一个。
输出的值:
1 | C:\Users\zerwa\Desktop>test |
当然,tokens也可以使用通配符,把所有的字符都作为参数输出
1 | @echo off |
使用skip参数,代表忽略几行
1 | @echo off |
输出的值:
1 | 七 八 九 |
使用eol参数,代表忽略以指定的单个字符开始的行
1 | @echo off |
输出的值:
1 | 一 二 三 |
使用usebackq参数,也就是转义字符“\”
1 | @echo off |
如果我们没有使用
usebackq
,("测试文本.txt")
里面的内容会被认为是字符串;如果使用了usebackq
,("测试文本.txt")
里面的内容会被认为是一个文件
1 | @echo off |
如果我们没有使用
usebackq
,('echo ATAO')
里面的内容会被认为是一个命令;如果使用了usebackq
,('echo ATAO')
里面的内容会被认为是一个字符串
date、time
在cmd中输入
1 | C:\Users\zerwa\Desktop>date |
如果想要单独获得年月日
1 | C:\Users\zerwa\Desktop>echo %date:~0,4% |
%date:~0,4%
,前后两个百分号表示取值,中间的冒号波浪号为固定写法,0
表示从第0个光标位置开始(也就是2023/07/09 周日
2023前面那个光标位置),4
表示向后数4位,在第四位光标之前的内容都被输出出来,也就是2023
在cmd中输入
1 | C:\Users\zerwa\Desktop>time |
如果想要单独获得时分秒
1 | C:\Users\zerwa\Desktop>echo %time:~0,2% |
set 赋值
在bat中输入
1 | @echo off |
字符串操作
裁剪
1 | @echo off |
和之前的date、time一样,基于裁剪
替换
在bat中输入
1 | @echo off |
输出
1 | 替换前ATAO2017 |
在上面的例子中,t
这个变量并没有被赋值,所以并没有真正的“替换”
1 | @echo off |
将
t
重新set一遍,才能真正替换,这里"t=%t:2017=2023%"
经测试加不加引号都可以
拼接
1 | @echo off |
t
和t2
不加引号也是可以的
扩充
用于处理路径,对输入的路径进行处理
假如我们的输入参数为%0
1 | ~0 -删除任何引号("),扩充%0 |
示例
修改bat
1 | @echo off |
%~p1
表示\wamp\
%~d1
表示C:
将两者合起来就是下面这个输出
输出
1 | C:\Users\zerwa\Desktop>test C:\wamp\wampmanager |
修改bat
1 | @echo off |
%~n1
表示输出文件名
%~x1
表示输出文件拓展名
1 | C:\Users\zerwa\Desktop>test C:\wamp\wampmanager |