常用注释方式有两种:REM 和 ::(双英文冒号)。
任何以单冒号:开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容。
@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。
输出信息。
1)打开回显或关闭回显功能
格式:
echo [{ on|off }]
如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”,如:
@echo off
2)输出信息
格式:echo 信息内容
3)输出空行,即相当于输入一个回车
格式:echo.
值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。
命令ECHO.输出的回车,经DOS管道转向可以作为其它命令的输入,比如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态。
4)建立新文件或增加文件内容
格式:
echo 文件内容>文件名
echo 文件内容>>文件名
例如:
c:>echo @echo off>autoexec.bat建立自动批处理文件
c:>echo c:\cpav\bootsafe>>autoexec.bat向自动批处理文件中追加内容
设置cmd窗口的标题。
还可以设置窗口大小:
mode con cols=100 lines=40
说明:此命令设置DOS窗口大小:40行,100列
设置命令窗口的颜色,dos的颜色属性设置是由两个十六进制数字指定。
背景色:0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白
前景色:8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白
color 0a
用于设置变量或对变量赋值。
格式:
set PATH_HOME=C:\Users\Administrator
参数:
1)提示用户输入
@echo off
set /p num=请输入要ping的次数:
ping /n %num% 127.0.0.1
pause.
2)提示用户输入并计算输入值
@echo off
set /p b=输入一个数字:
echo %b%
set /a a=2*%b%
echo %b%+%b%=%a%
pause>nul
set /a 执行数学计算
set /p 提示用户输入
%%处理变量引导符。
格式:
echo %PATH_HOME%
输出结果:
C:\Users\Administrator
用于条件判断。
格式:
if <条件> (<方法体>) [else if <条件> (<方法体>)][else (<方法体>)]
1)判断两个字符串是否相等
set param=1
if %param% EQU "1" (
echo true
)
2)验证文件是否存在
::存在
if exist "C:\a.txt" (
echo file is find!
) else (
echo file is not found!
)
::不存在
if not exist "C:\a.txt" (
echo file is not found!
)
3)带参数验证
set param=abc
if /I "%param%" EQU "ABC" (
echo true
)
参数:
比较参数如下:
删除目录。
格式:
rd [/s] [/q] [drive:]path
参数:
1)删除目录
rd /s /q d:\apache\tomcat\apache-tomcat-7.0.67\wtpwebapps
创建文件夹。
格式:
md [路径\]目录
1)创建单个文件夹
md e:\test
在D盘下建立一个名为test的文件夹。
2)创建缺省路径目录
md test
这里为缺省路径,在当前目录下创建一个名为test的文件夹。
3)创建含有空格或是特殊符号的文件夹
md "e:\my test"
在E盘下建立一个名为my test的文件夹。对于新建的文件夹名称中包含有空格或是特殊符号的,一定要用双引号“”把文件夹名括起来。
4)同时创建多个目录
md d:\test e:\test\aaa test
5)创建多级目录
md d:\a\b\c
重命名文件(夹)。
格式:
ren [drive:][path]filename1 filename2.
1)单个文件的重命名
ren d:\test.txt test.bat
2)缺省路径文件的重命名
ren test.txt test.bat
缺省路径情况下,把当前目录下的123.txt重命名为456.bat。
3)批量重命名
ren *.bat *.txt
把后缀名为bat的文件批量更改为txt后缀后的文件。
通过*和?这两个通配符来批量重命名。*表示任意多个字符,?表示一个字符。
移动文件并重命名文件和目录。
格式:
move [/y | /-y] [drive:][path]filename1[,...] destination
move [/y | /-y] [drive:][path]dirname1 dirname2
参数:
代码1:
move d:\test d:\test2
如果把文件夹test移到文件夹test2内。
代码2:
move test.txt test2
把当前目录下的test.txt移动到当前文件夹test2内。这里都使用了相对路径,缺省路径情况下默认为当前目录。
代码3:
move test.txt e:\test2
把当前目录下的test.txt移动到e:\test2目录下。
想要移动的文件(夹)可以使用相对路径,也可以使用绝对路径,缺省路径情况下默认为当前目录。
Destination 只能是目录路径, 可以使用相对路径,也可以使用绝对路径,缺省路径情况下默认为当前目录。
代码1:
move d:\test d:\test2
这里要注意一下,如果目标文件夹test2不存在,则把test移到d:\下,并把自身名称更改为test2。利用这一特性,move命令具备重命名功能。
代码2:
move d:\test.txt d:\abc\test2.txt
如果 test2.txt存在,系统将会提示你:改写 D:\test2.txt 吗? (Yes/No/All):
当你输入Y后则test.txt会覆盖test2.txt。如果test2.txt不存在,则把test.txt移到d:\abc目录下,并重命名为test2.txt。
代码3:
move /y test.txt test2.txt
如果test.txt和test2.txt都存在,通过/y参数后,系统不会提示你,而直接把test.txt覆盖test2.txt。
代码4:
move test.txt e:\abc\test2.txt
对于跨区移动,如果test2.txt存在会提示:文件存在。命令不会执行;如果test2.txt不存在,则把test.txt移到e:\abc目录下,并重命名为test2.txt。
跳转,用:XX构筑一个标记,用goto XX跳转到XX标记处。
@echo off
:MENU
echo.
echo. [1] 测试1
echo. [2] 测试2
echo. [0] 退出
echo.
echo.请输入选择的序号:
set /p ID=
if "%id%"=="1" goto show1
if "%id%"=="2" goto show2
if "%id%"=="0" exit
PAUSE
:show1
echo AAAAAAAAAAAAAA
echo BBBBBBBBBBBBBB
goto MENU
:show2
echo CCCCCCCCCCCCCC
echo DDDDDDDDDDDDDD
goto MENU
当输入1的时候,会跳转到show1代码块。
注意代码块中有个 “goto MENU” 加上这个是为了不让输出后关闭窗口,而是继续执行 “MENU” 代码信息。
在批处理的过程中调用另一个批处理,当另一个批处理执行完了后回调自身。
@echo off
:MENU
echo.
echo. [1] 测试1
echo. [2] 测试2
echo. [0] 退出
echo.
echo.请输入选择的序号:
set /p ID=
if "%id%"=="1" goto show1
if "%id%"=="2" goto show2
if "%id%"=="0" exit
PAUSE
:show1
call :show11
call :show12
goto MENU
:show2
call :show21
call :show22
goto MENU
:show11
echo AAA-show11
goto :eof
:show12
echo BBB-show12
goto :eof
:show21
echo CCC-show21
goto :eof
:show22
echo DDD-show22
goto :eof
输出结果:
[1] 测试1
[2] 测试2
[0] 退出
请输入选择的序号:
1
AAA-show11
BBB-show12
[1] 测试1
[2] 测试2
[0] 退出
请输入选择的序号:
注意:如果不加 goto:eof 命令,会继续往下执行。
暂停。
程序返回码。
bat脚本中常用%errorlevel%表达上一条命令的返回值,用于判断命令执行状态,命令运行结束后可以用echo %errorlevel%查看返回码,用于判断刚才的命令是否执行成功。
1)判断一条命令执行状态
::查找是否有chrome.exe线程
tasklist|find /i "chrome.exe">nul
echo %errorlevel%
if %errorlevel% EQU 0 (
echo yes
) else (
echo no
)
一般上一条命令的执行结果返回的值只有两个,0表示”成功”、1表示”失败”,实际上,errorlevel 返回值可以在0~255 之间。
2)判断多条命令执行状态
@echo off
setlocal enabledelayedexpansion
tasklist|find /i "360tray.exe">nul
echo 360:!errorlevel!
if !errorlevel! EQU 0 (
tasklist|find /i "chrome.exe">nul
echo chrome:!errorlevel!
if !errorlevel! EQU 0 (
::这个设置为找不到
tasklist|find /i "We2Chat.exe">nul
echo We2Chat:!errorlevel!
if !errorlevel! EQU 0 (
echo ........
) else (
echo We2Chat:no
)
) else (
echo chrome:no
)
) else (
echo 360:no
)
pause>nul
输出结果:
360:0
chrome:0
We2Chat:1
We2Chat:no
在for循环中或if语句中多条命令都需要获取返回值等情况下,用errorlevel会显得无效,从第二条命令开始errorlevel的值都不会变。此处涉及批处理中的变量延迟问题,并不是errorlevel无效,而是对errorlevel变量的引用采用的是没开启变量延迟情况下的百分号%。
setlocal EnableDelayedExpansion:开启变量延迟的设置,即延迟环境变量扩展,告诉解释器在遇到复合语句的时候,不要将其作为一条语句同时处理,而是一条一条地去解释。但是这时如果仍然用百分号%来引用变量是不起作用的,必须用感叹号!,如!errorlevel!。
退出cmd。
::验证文件是否存在
if not exist "d:/test.txt" (
echo 缺少文件!
pause
exit
)
学过编程的可以知道,exit类似于return。
批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
1)调用图形界面打开D盘
start explorer d:\
2)打开多个微信窗口
start D:\WeChat\WeChat.exe&D:\WeChat\WeChat.exe
把执行结果定向到空,不返回任何结果。
格式:
'<执行命令>' >nul
1)屏蔽屏幕输出
pause > nul
pause 就是暂停命令,执行时会在命令行窗口显示“请按任意键继续. . .”并等待你按键。
pause > nul的作用是同样的,区别是不显示“请按任意键继续. . .”这些字,nul相当于空文件,把这些文字隐去了。同样是等待你按键。
2)屏蔽一切屏幕输出
del abc.txt>nul 2>nul
这个">nul 2>nul"可以屏蔽一切屏幕的输出。如果使用"[命令]>nul"就可以屏蔽命令在屏幕上的输出,但是有的命令执行会出错,即使用了">nul"也不能屏蔽命令产生的信息,所以就在后面加" 2>nul"这个,就是"[命令]>nul+空格+2>nul",这样,不管命令是否正确的运行,都不会在屏幕看到这个命令所产生的屏幕显示了。
在文件中搜索字符串。
格式:
find [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
参数:
1)查找字符串
find "abc" d:/test.txt
::忽略大小写
find /i "abc" d:/test.txt
2)显示行号
find /n "abc" d:\abc.txt
3)仅显示包含字符串的行数
find /c "abc" d:\abc.txt
4)显示所有未包含指定字符串的行
find /v "abc" d:\abc.txt
这个参数用于找出文件中不包含指定字符串的行。在这里表示查找不包含"abc"字符串的行。
注意:find命令中要查找的字符串一字要用双引号" "括起来。
在文件中寻找字符串。
格式:
findstr [/b] [/e] [/l] [/r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/f:file] [/c:string] [/g:file] [/d:dir list] [/a:color attributes] [/off[line]] strings [[drive:][path]filename[ ...]]
参数:
findstr 命令中正则表达式的用法规则
findstr " strings " [drive:][path]filename
1.1)查找字符串
findstr "abc" d:/test.txt
::忽略大小写
findstr /i "abc" d:/test.txt
1.2)查找的多个字符串
findstr /r "wechat qq" test.txt
在test.txt中查找包含有 “wechat”或“qq”的行,查找的多个字符串间用空格隔格开。
/R:将搜索字符串作为正则表达式使用。参数/R 强调以正则表达式规则来解读字符串。
1.3)在当前目录和所有子目录中搜索
findstr /s /i "wechat" *.txt
在当前目录和所有子目录中的.txt文件中搜索字符串"wechat"(不区分字母大小写)。
1.4)指定字符串作为文字搜索字符串
findstr /c:"tencent wechat" test.txt
在test.txt中查找包含有 “tencent wechat”这几个字符的行。注意,这里“tencent wechat”是一整体的。
注意:
::在文件 test.txt 中寻找 "hello" 或 "there"
findstr "hello there" test.txt
::在文件 test.txt 寻找 "hello there"
findstr /c:"hello there" test.txt
通配符和重复符规则,即 . 和 *。
通配符:即一个句点,代表任何一个字符,而且只能是一个,包括字母、数字、半角符号还有空格。
重复符:即型号* 代表前面字母的出现次数(出现次数从0到多次,0表示没有)。
2.1)查找任意字符,包括空行
findstr .* test1.txt
或
findstr ".*" test1.txt
2.2)查找指定字符串开关的字符串
findstr ac* test.txt
findstr abcd* test.txt
输出结果:
a
ac
acc
addc
ab
abc
abdc
abde
在文件 test.txt 中查找出现一个“a”字符串,以及a后面出现过0次或者任意次c的字符行。
在文件test.txt中查找出现一个“ab”字符串,以及ab后面出现过0次或者任意次c的字符行。
即 ^ 和 $。
3.1)查找指定行首的字符串
findstr "^test" test.txt
输出结果:
test main
testapp
3.2)查找指定行首行尾的行
findstr "^test$" test.txt
在文件test.txt中查找行首为test,且行尾也为test的行,即test独自一行。
字符集规则,即[class]。
如果在字符集内插入通配符和重复符号,即"[.*]"将会把. 和 *视为普通字符,没有通配和重复的含义。
4.1)查找数字0-9的任意行
findstr "[0-9]" test.txt
输出结果:
1abcd
3 ab acd
4.2)查找包括任意字母的行
findstr "[a-zA-Z]" test.txt
4.3)查找包括其中任意一字母的行
findstr "[abcezy]" 2.txt
4.4)查找指定字母范围的行
findstr "[a-gq-t]" test.txt
在文件test.txt中查找小写字符a到g 或q到t的任意一字母的行。
4.5)匹配任意字母行
findstr "A[abc][123]Y" test.txt
在文件test.txt中查找可以匹配 AaY , AbcY, A234Y的行。
5.1)过虑纯数字的行
findstr "[^0-9]" test.txt
注意:纯数字的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!
5.2)过虑纯字母的行
findstr "[^a-z]" test.txt
注意:纯字母的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!
5.3)过滤仅含有指定字母组成的纯字母字符串的行
findstr "[^abc]" test.txt
注意:仅含有由abc三个字母组成的纯字母字符串的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!
该规则是匹配类似单个英文单词的,即\
该xyz可以是英文单词或数字,但不适用于汉字。符号 \ 理解为转义符,化解小于号和大于号的重定向命令含义。
6.1)查找指定前缀的字符串的行
findstr "\
6.2)查找指定后缀的字符串的行
findstr "abc\>" test.txt
6.3)精确查找
findstr "\ test.txt
查看系统进程。
格式:
tasklist [/s system [/u username [/p [password]]]] [/m [module] | /svc | /v] [/fi filter] [/fo format] [/nh]
参数列表:
1)查看本机所有进程
tasklist
在“命令提示符”中输入Tasklist 命令即可显示本机的所有进程,显示结果由5部分组成:图像名(进程名)、PID、会话名、会话#和内存使用。
2)查找某一进程
tasklist|find /i "nginx.exe">nul
tasklist查找所有进程,让find找出nginx.exe进程。
3)根据pid查询指定进程
tasklist|findstr xxxx
终止指定进程。
格式:
taskkill [/s system [/u username [/p [password]]]] { [/fi filter] [/pid processid | /im imagename] } [/f] [/t]
参数列表:
1)根据进程名称结束某一进程
taskkill /F /IM nginx.exe >nul
2)根据进程PID结束某一进程
taskkill /PID xxx
SC 是用于与服务控制管理器和服务进行通信的命令行程序。
格式:
SC [服务器名称] 命令 [选项名称=选项值]
常用参数:
1)查询Winows具体服务配置
sc query MariaDB
服务名不区分大小写。
2)实现模糊查询
sc query state= all | findstr /I "MariaDB"
sc query state= all | find /I "MariaDB"
sc query | find /i "MariaDB"
sc query MariaDB | find /i "STATE">nul
sc query 可以与 findstr/find 实现模糊查询,并且支持正则。
state状态:
3)查询服务PID
sc queryex MariaDB
4)查看window服务的详细配置
sc qc MariaDB
start_type为启动类型:
5)设置服务的启动类型
sc config MariaDB start= auto
设置服务的启动类型:
注意:SC命令还可以创建、删除、启动、停止服务等。但不推荐sc启动、停止服务操作,因为sc启动服务但不启动依赖;可以使用 “net start/stop 服务名” 代替, 该命令会自动启动或停止相关联的服务。
格式:
for [参数] %%变量名 in (相关文件或命令) do 执行的命令
注意:
参数:
1.1)简单遍历
for %%I in (A,B,C) do echo %%I
输出结果:
A
B
C
for语句的形式变量H,可以换成任意一个变量信息。for语句以逗号为分隔符,把 A,B,C 这个字符串切分成三个元素:A、B和C,由此决定了do后的语句将会被执行3次。
1.2)读取根目录
::显示d盘根目录下的所有目录
for /d %%i in (d:\*) do echo %%i
::显示当前目录下名字只有1-3个字母的目录
for /d %%i in (???) do echo %%i
这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字。(只会搜索指定目录下的目录,不会搜索再下一级的目录。)
1.3)搜索指定路径及所有子目录中与set相符的所有文件
::查找j盘下所有以.mp4结尾的文件,包含子目录
for /r j:\ %%i in (*.mp4) do echo %%i
::查找j盘下所有目录,包含子目录
for /r j:\ %%i in (1) do echo %%i
::查找j盘下sudu.pdf存在的目录
for /r j:\ %%i in (sudu.pdf) do if exist %%i echo %%i
此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。
1.4)以增量形式从开始到结束
for /l %%i in (1,1,5) do @echo %%i
::输出1 2 3 4 5
for /l %%i in (1,2,10) do @echo %%i
::输出1,3,5,7,9
for /l %%i in (100,-20,1) do @echo %%i
::输出100,80,60,40,20
for /l %%i in (1,1,5) do start cmd
::打开5个CMD窗口
for /l %%i in (1,1,5) do md %%i
::建立从1~5共5个文件夹
for /l %%i in (1,1,5) do rd /q %%i
::删除从1~5共5个文件夹
该命令表示以增量形式从开始到结束的一个数字序列,可以使用负的 Step。
使用文件解析来处理命令输出、字符串及文件内容
这个参数是最难的,而且参数也最多。“for /f”常用来解析文本,读取字符串。
新建一ANSI编码的bat_test.txt文件,文件内容如下:
1、aaa.txt
2、bbb.txt
3、ccc.mp3
4、ddd.doc
5、eee.txt
2.1)显示全部内容
@echo off
for /f %%i in (bat_test.txt) do echo %%i
pause>nul
输出结果:
1、aaa.txt
2、bbb.txt
3、ccc.mp3
4、ddd.doc
5、eee.txt
如果不使用参数“/f”,运行结果只显示括号里的文字字符“bat_test.txt”,而不能读取文本文件“bat_test.txt”中的内容。可见,“/f”是解析文本字符串的好工具。
2.2)根据指定内容分割(delims)
for /f "delims=、" %%i in (bat_test.txt) do echo %%i
for /f "delims=." %%i in (bat_test.txt) do echo %%i
输出结果:
1
2
3
4
5
1、aaa
2、bbb
3、ccc
4、ddd
5、eee
"delims=、"表示定义顿号“、”为分隔符,并用该分隔符“、”切分文本字符串。字符串就是“歌曲列表.txt”里的内容,也就是文件里的文字和标点符号。
该顿号是原文中就有的。除了顿号“、”,原文中还有减号“-”和点号“.”,因此你也可以用它们来做分隔符。
默认情况下,单纯使用delims而不用tokens时,只显示第一个分隔符前的内容,第一个分隔符和第一个分隔符后面的内容将被忽略。
delims还可以定义多个分隔符,如:“delims=、.”。
2.3)提取单列(tokens)
for /f "tokens=2 delims=、." %%i in (bat_test.txt) do echo %%i
输出结果:
aaa
bbb
ccc
ddd
eee
用delims定义顿号“、”和点号“.”作为分隔符,将原文分成三部分。如“1、aaa.txt”被分割成:
第一部分(第一列):1
第二部分(第二列):aaa
第三部分(第三列):txt
“tokens=2”表示用tokens提取第二列的字符串,即“aaa”。
没有被tokens定义提取的第一列和第三列将被忽略。
2.4)提取多列(tokens)
for /f "tokens=1,3 delims=、." %%i in (bat_test.txt) do echo %%i %%j
输出结果:
1 txt
2 txt
3 mp3
4 doc
5 txt
“tokens=1,3”表示只提取第一列和第三列。
“delims=、.”表示定义顿号和点号为分隔符。
“%%i %%j”对应于“token”后面的列数。有多少列就要有多少个输出变量,并且各变量中的字母存在先后顺序。
2.5)忽略分隔符
for /f "tokens=1-3 delims=、." %%i in (bat_test.txt) do echo %%i %%j %%k
输出结果:
1 aaa txt
2 bbb txt
3 ccc mp3
4 ddd doc
5 eee txt
“tokens=1-3”中的“1-3”表示第一至第三列。
——————————
如有不足请留言指正
相互学习,共同进步