参考:
https://www.cnblogs.com/dirgo/p/18108455
https://blog.csdn.net/AnChenliang_1002/article/details/131288871
https://www.cnblogs.com/jingxian666/p/16814375.html
https://www.hxstrive.com/subject/windows_bat/51.htm
什么是BAT
全称即Batch,批处理,是一类可执行的文本文件,扩展名为.bat。
注意:BAT脚本文件为ANSI编码(否则出现中文乱码)
常用命令与语法
1、注释
rem注释时,不执行后面的语句,但会显示;
:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)
%注释内容%(可以用作行间注释,不能出现重定向符号和管道符号)
@echo off
rem 注释1
echo 11
::注释2
echo 22
%注释3%
echo 33
pause
::结果
11
22
33
请按任意键继续. . .
2、开启关闭回显
@置于语句前则该条语句不会回显(无视echo on)
echo off关闭回显功能,直到出现echo on,但其本身会回显,往往和@一起使用,即@echo off(关闭所有回显功能)
echo 11
pause
::结果
C:\Users\ab225\OneDrive\桌面>echo 11
11
C:\Users\ab225\OneDrive\桌面>pause
请按任意键继续. . .
@echo off
echo 11
pause
::结果
11
请按任意键继续. . .
3、输出和换行
echo后加内容即输出该内容,如:echo “welcome!”;
echo.换行命令,即echo后加一个点
@echo off
echo 11
echo.
echo "换行后"
pause
::结果
11
"换行后"
请按任意键继续. . .
4、设置标题title
@echo off
::title设置标题
title 启动标题
::用以判断上一条命令是否执行成功,默认为0,出错为1
set a=%errorlevel%
echo %a%
if %a%==0 echo 执行成功
if %a%==0 (
echo 执行成功
) else (
echo 执行失败
)
pause
0
执行成功
执行成功
请按任意键继续. . .
set
1、定义变量和延迟赋值
@echo off
set b=1
::复合语句
set b=2 & echo %b%
::结果输出1
::解析
::windows在解释执行此代码段时,在遇到复合语句,只把它当一条语句处理而不是多条语句,
::所以,在第二条语句中的%b%会被替换成它目前的值b
:: setlocal enabledelayedexpansion用于开启变量延迟,这是告诉解释器,在遇到复合语句的时候,
::不要将其作为一条语句同时处理,而仍然一条一条地去解释。
::但是这时必须用!a!来引用变量,如果仍然用%a%引用是不起作用的
setlocal enabledelayedexpansion
set a=1
set a=2 & echo !a!
set a=3 & echo %a%
::结束延迟赋值的作用域
endlocal
pause
::输出
2
2
2、接收用户输入数据
@echo off
set /p a="请输入1:"
if %a% == 1 ( echo "输入了1" ) else (echo "输入的不是1")
pause
请输入1:1
"输入了1"
请按任意键继续. . .
3、系统变量
@echo off
::查看所有环境变量
set
::查看环境变量JAVA_HOME的值
if defined JAVA_HOME echo %JAVA_HOME%
pause
5、if语句
注意:if语句块在执行时是当做一条语句加载的,故需要延迟赋值来解决其内部变量引用的问题 - ?
@echo off
set /p a="请输入1:"
echo "判断1"
if %a% == 1 ( echo "输入了1" ) else (echo "输入的不是1")
echo.
echo "判断2"
if not %a% == 1 ( echo "输入的不是1" ) else (echo "输入了1")
pause
请输入1:1
"判断1"
"输入了1"
"判断2"
"输入了1"
请按任意键继续. . .
1、help
和/?
都可以用来查看某个指令的帮助文档。
语法格式:指令 /?或者是help 指令
如title /?,就是打印title这个指令的帮助文档。
需要注意,单独执行help,会打印出支持的所有指令以及简单的功能说明。
2、title
语法格式:title window_name
作用设置当前的cmd窗口标题
3、color
语法格式:color 16进制颜色格式
用来设置批处理控制台的背景和字体颜色,颜色属性由两个十六进制数字组成,第一个数字表示背景颜色,第二个数字表示字体颜色。
如color 07表示常规的黑底白字。
每个数字可以为以下值:
0=黑色
1=蓝色
2=绿色
3=湖蓝色
4=红色
5=紫色
6=黄色
7=白色
8=灰色
9=淡蓝色
A=淡绿色
B=淡浅绿色
C=浅红色
D=淡紫色
E=淡黄色
F=亮白色
4、mode
一般用来调整当前命令行窗口的大小、代码页等。
如:mode con cols=113 lines=15 & color 0A
就是调整窗口的长是113个字符,宽是15个字符,顺带给窗口换了换颜色,一般会放在最前面执行。
可以通过在cmd窗口中输入mode /?来查看详细功能。
5、echo
语法格式:
echo [{on|off}] [message]
on:允许批处理文件在处理时回显命令;
off:不允许。
在调用了echo off之后,接下来执行的所有命令都将不会在前台打印出命令本身。
使用on
::代码
echo on
dir
echo 111111
::输出
C:\Users\ab225\OneDrive\桌面>echo on
C:\Users\ab225\OneDrive\桌面>dir
驱动器 C 中的卷是 Windows-SSD
卷的序列号是 4CF7-0463
C:\Users\ab225\OneDrive\桌面 的目录
2024/08/03 13:08 <DIR> .
2024/05/07 22:35 <DIR> ..
2024/08/03 13:09 34 1 - 副本.bat
2024/07/24 22:51 62 1.sql
2024/07/08 10:08 5,781 11.ini
2023/04/04 20:43 30 122.185.bat
2024/05/20 10:04 28 14.17 - 副本.bat
2024/07/24 22:15 9,686 2.sql
2022/03/10 09:00 29 200.14.bat
2023/06/01 22:33 651 aardio.lnk
...(省略)
43 个文件 52,827 字节
4 个目录 27,495,849,984 可用字节
C:\Users\ab225\OneDrive\桌面>echo 111111
111111
使用off
可以看到,除了第一行命令外,其他命令本身都没有被打印出来
echo off
dir
echo 111111
pause
::输出
C:\Users\ab225\OneDrive\桌面>echo off
驱动器 C 中的卷是 Windows-SSD
卷的序列号是 4CF7-0463
C:\Users\ab225\OneDrive\桌面 的目录
2024/08/03 13:08 <DIR> .
2024/05/07 22:35 <DIR> ..
2024/08/03 13:14 35 1 - 副本.bat
2024/07/24 22:51 62 1.sql
2024/07/08 10:08 5,781 11.ini
2023/04/04 20:43 30 122.185.bat
2024/05/20 10:04 28 14.17 - 副本.bat
2024/07/24 22:15 9,686 2.sql
2022/03/10 09:00 29 200.14.bat
...(省略)
43 个文件 52,828 字节
4 个目录 27,497,222,144 可用字节
111111
6、@
@可以加在一行命令的行首位置,表示禁止当前行命令本身回显在屏幕上
如:@echo on
相比使用echo on|off来控制整个脚本层级的回显,@可以更方便的控制行级的回显。
echo off
echo 111111
pause
:: 结果
C:\Users\ab225\OneDrive\桌面>echo off
111111
请按任意键继续. . .
::使用 @
@echo off
echo 111111
pause
::结果
111111
请按任意键继续. . .
7、pause
用于暂停批处理的执行,由用户决定是否继续执行。
会显示"按任意键继续。。“,同时卡住不再继续执行,除非用户点击了任意键之后,才会继续执行。
如果你不想让界面显示"按任意键继续。。”,但还想要让界面卡住不向下执行,则可以结合重定向符来实现
::使用 @
@echo off
echo 111111
::结果
111111
(窗口一闪而过)
::使用pause
@echo off
echo 111111
pause
::结果
111111
请按任意键继续. . .
::不显示 “请按任意键继续. . .”
@echo off
echo 1
pause
echo 2
pause > nul
echo 3
::结果:显示1后,按任意键,再显示2,再按任意键,显示3,然后窗口迅速关闭
1
请按任意键继续. . .
2
3
8、call
语法:
CALL [path] filename[.bat] [arguments]
[path] 是可选的,指定要调用的文件的路径如果与主批处理文件在同一目录下,则可以省略);
[filename]是要调用的批处理文件的名称;
[arguments] 是传递给被调用脚本的参数(如果有的话)。
1、调用其他的批处理文件
语法是:
call xxx.bat
①、无参调用
:: 主批处理文件(MainBatch.bat)
@ECHO OFF
ECHO 主批处理文件开始执行。
CALL SubBatch.bat
ECHO 主批处理文件执行完毕。
PAUSE
:: 子批处理文件(SubBatch.bat)
@ECHO OFF
ECHO 子批处理文件被调用。
PAUSE
::输出
主批处理文件开始执行。
子批处理文件被调用。
请按任意键继续. . .
主批处理文件执行完毕。
请按任意键继续. . .
②、带参调用
:: 主批处理文件(MainBatch.bat)
@ECHO OFF
ECHO 主批处理文件开始执行。
CALL SubBatch.bat Arg1 Arg2
ECHO 主批处理文件执行完毕。
PAUSE
:: 子批处理文件(SubBatch.bat)
@ECHO OFF
ECHO 子批处理文件被调用,参数1=%1,参数2=%2
PAUSE
::输出
主批处理文件开始执行。
子批处理文件被调用,参数1=Arg1,参数2=Arg2
请按任意键继续. . .
主批处理文件执行完毕。
请按任意键继续. . .
2、定义和调用批处理子例程
:: 主批处理文件(MainBatch.bat)
@ECHO OFF
ECHO 主批处理文件开始执行。
CALL :RunSubBatch Arg1 Arg2
ECHO 主批处理文件执行完毕。
PAUSE
:: 子批处理文件中的标签调用
:RunSubBatch
ECHO 子例程被调用,参数1=%1,参数2=%2
GOTO :EOF
::结果
主批处理文件开始执行。
子例程被调用,参数1=Arg1,参数2=Arg2
主批处理文件执行完毕。
请按任意键继续. . ..
1和2 可以一起用
3、使用CALL实现函数式编程
通过使用标签(Labels)和GOTO命令,我们可以在批处理中模拟函数的调用和返回。
@ECHO OFF
CALL :MyFunction
PAUSE
GOTO :EOF
:MyFunction
(
ECHO 这是一个使用CALL实现的"函数"。
echo "多行命令需要用括号,没有则不需要"
)
:: 结果
这是一个使用CALL实现的"函数"。
"多行命令需要用括号,没有则不需要"
请按任意键继续. . .
ping命令
@echo off
ping 172.20.34.22
::无休止ping某地址
ping www.baidu.com -t
start命令
注意:执行start时将开启一个新线程来执行该程序,原程序不受影响继续执行
@echo off
echo 当前正在运行的批处理文件所在路径:%~dp0
start /b %~dp0bin\zkServer
pause
timeout延迟
@echo off
set a=1
::延迟五秒输出
timeout 5 >nul
echo %a%
pause
ren命令重命名文件(夹)
@echo off
::将1.txt重命名为58.bat
ren d:\test\1.txt 58.bat
::将d:\test\目录下所有文件名为1开头的txt文件改为bat文件
ren d:\test\1*.txt *.bat
::将d:\test\目录下所有文件名为1开头三个字符的bat改为txt文件
ren d:\test\1??.bat ???.txt
xcopy命令复制文件
@echo off
::将D:\test目录下所有文件(夹)复制到F:\test1
::/F目录下所有文件(夹),/y已存在时直接覆盖
xcopy D:\test F:\test1 /e /y
del命令删除文件
@echo off
::删除该层目录下的所有文件,需要确认[Y/N]
del d:\test
pause
::不需要确认
del /q d:\test
::删除该目录下所有层级的文件,不删除文件夹,需要逐个文件夹确认
del /s d:\test
::删除文件111.png,不需要确认
del d:\test\111.png
move命令移动文件(夹)
@echo off
::文件夹移动,如果test文件夹存在,则将test5文件夹移动到test文件夹下
::如果test文件夹不存在,则将test5文件夹移动到test1文件夹下并重命名为test
::注意:文件夹移动不能跨分区
move e:\test5 e:\test1\test
::将d:\test\1.txt文件移动到e:\下并重命名为23.txt
::如果该目录已存在23.txt,则会覆盖
move d:\test\1.txt e:\23.txt>nul&&echo 移动成功并重命名
::将e:\23.txt文件移动到e:\test文件夹下
move e:\23.txt e:\test>nul&&echo 移动到文件夹下
md命令创建文件夹
:创建文件夹
md e:\test\test1
::文件夹名有空格需要加引号
md "e:\test op"
::空格隔开,创建多个
md e:\test1 e:\test9\test2 "e:\test5 test6"
变量%0–%9
%0指该文件本身,%1–%9为接收到的参数
for语句
常规
@echo off
::当你运行这段脚本时,它会列出当前计算机上存在的硬盘分区
::exist %%i: 会检查路径 %%i: 是否存在
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause
for/f
从一个或多个文件中读取内容,并将其逐行处理。这使得for/f成为处理文本文件、批量处理数据等任务的理想选择
语法:for /f ["options"] %variable in ('command') do command
options"表示一些可选的参数,
%variable用于定义一个用来存储命令输出值的变量,
'command’表示要执行的命令。
options常用的参数选项包括:
1、-delims
指定分隔符,用于将命令输出的每行数据分割成多个部分
2、-tokens
用于指定要存储的数据部分的位置。默认情况下,for/f命令会将整行数据存储到变量中
3、-skip
跳过指定的行数
4、-eol
指定行注释的字符
例子:
1、按行读取文件内容
::文本内容
apple
banana
duck
egg
frog
::脚本
for /f "tokens=*" %i in (c:\data.txt) do echo"%i"
::输出
C:\Users\Administrator>echo"apple"
"apple"
C:\Users\Administrator>echo"banana"
"banana"
C:\Users\Administrator>echo"duck"
"duck"
C:\Users\Administrator>echo"egg"
"egg"
C:\Users\Administrator>echo"frog"
"frog"
例子2
2、分割字符串
::config.txt的文件,内容
name=zhangsan
age=25
::脚本
for /f "delims== tokens=1,2" %i in (c:\config.txt) do echo Key:%i, Value:%j
::输出
C:\Users\Administrator>echo Key:name,Value:zhangsan
Key:name,Value:zhangsan
C:\Users\Administrator>echo Key:age,Value:25
Key:age,Value:25
goto
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:goto label (label是参数,指定所要转向的批处理程序中的行)
行用 :label 表示
@echo off
:start
cls
set /p numis=请输入数字1或2:
if /i "%numis%"=="1" goto 1
if /i "%numis%"=="2" (goto 2) else (echo 输入有误!&&pause>nul&&goto start)
:1
echo 你输入的是1
pause>nul&&goto start
:2
echo 你输入的是2
pause>nul&&goto start
clip复制命令
::将文本文件的内容复制到剪贴板
clip < example.txt
@echo off
::echo 命令将输出文本重定向到管道 (|),然后 clip 命令读取管道中的内容并将它复制到剪贴板。
echo Hello, this is a test message. | clip
::窗口不显示东西
pause
::将几个命令的输出合并成一个字符串,并复制到剪贴板
@echo off
setlocal
rem 创建一个临时文件
set "tempFile=%temp%\clipboard_temp.txt"
rem 清空临时文件
>nul echo. > "%tempFile%"
rem 添加第一行文本
echo Line 1 >> "%tempFile%"
rem 添加第二行文本
echo Line 2 >> "%tempFile%"
rem 添加系统日期
echo Date: %date% >> "%tempFile%"
rem 添加系统时间
echo Time: %time% >> "%tempFile%"
rem 将临时文件的内容复制到剪贴板
clip < "%tempFile%"
rem 删除临时文件
del "%tempFile%"
pause
查看wifi密码
@echo off
:: 当前文件编码要和设置的编码一致,不然会乱码导致一些命令有问题
::chcp 65001 #换成utf-8代码页
::chcp 936 #换成默认的gbk
::chcp 437 #美国英语
chcp 65001 >nul
for /f "tokens=1* delims=:" %%i in ('netsh wlan show profiles ^| findstr /c:"All User Profile"') do (
call :GetPass %%j
)
pause
::跳转到脚本的末尾,结束脚本的执行
goto :eof
:GetPass
echo WiFi : %*
for /f "delims=" %%a in ('netsh wlan show profile name^="%*" key^=clear ^| findstr /c:"Key Content"') do (
echo %%a
)
goto :eof