Bat
Bat
Bat脚本(Batch Script,也叫批处理脚本)是windows系统下一种以.bat或.cmd为扩展名的脚本文件,用于自动化执行一系列命令。是基于Windows命令行(CMD)的一种脚本语言。
CMD(命令提示符)
cd 切换目录
主要用于显示或切换当前目录
// 不带参数时会显示当前所在的工作目录
cd
// 返回上一级目录
cd ..
// 返回根目录
cd \
// 切换盘符直接用盘符名加:
D:
// /d 表示同时切换盘符和目录
cd /d D:\Desktop
dir 查看目录
dir [路径] [参数]
路径:要查看的目录(默认是当前目录)
参数:控制输出格式、显示内容等
// 查看当前目录内容
dir
// 查看指定目录内容
dir D:\Desktop
// 分页显示(按空格翻页)
dir /p
// 宽列表显示(多列排列)
dir /w
// 显示所有文件(包含隐藏、系统文件)
dir /a
// 按名称排序
dir /o:n
// 按时间倒序排序
dir /o:-d
// 显示子目录下所有文件(递归)
dir /s
// 简洁模式(只显示文件名,适合导出)
dir /b
// 组合参数:显示所有文件 + 递归子目录 + 分页
dir /a /s /p
// 查找当前目录及子目录下所有 txt 文件
dir /s *.txt
// 导出目录下的文件名到 list.txt
dir D:\Desktop /b > list.txt
cls 清屏
// 清空屏幕内容
cls
exit 退出
// 退出
exit
netstat 网络状态查看
PID(Process ID)进程编号。每个正在运行的程序(进程)在操作系统中都会分配一个唯一的PID用来标识它、
// 查看某个端口是谁占用了
netstat -ano | findstr 8080
// 显示所有连接和监听端口
netstat -a
// 常用组合命令: 查询端口占用 + 找出具体进程 + 杀进程
netstat -ano | findstr 8080 // 查询端口占用
tasklist | findstr [PID] // 找出具体进程
taskkill /PID 18456 /F // 杀死PID为18456的进程
Bat命令
@echo off 标配开头
@echo off 是批处理脚本的标配开头,核心作用是关闭脚本执行过程中所有命令的回显(即不显示要执行的命令本身,只显示命令的执行结果),让控制台输出更整洁、易读。
(1)关闭回显
@echo off
chcp 65001 > nul
:: Empty
echo tensoflow
pause
执行效果
tensoflow
请按任意键继续. . .
(2)开启回显
:: Empty
chcp 65001 > nul
echo tensoflow
pause
执行效果
D:\Desktop>echo tensoflow
tensoflow
D:\Desktop>pause
请按任意键继续. . .
chcp 切换字符编码
是Windows控制台(CMD)中用于切换/查看字符编码的核心命令,也是解决处理中文乱码的关键。
小贴士
永久解决Bat文件中文乱码问题可以保存时选择ANSI编码。
(1)查看当前代码页
@echo off
chcp
pause
执行效果
活动代码页: 936
请按任意键继续. . .
936 是 GBK/GB2312 编码的代码页编号,也是中文 Windows 的默认值。
(2)切换代码页
@echo off
rem 切换到UTF-8 > nul屏蔽切换提示
chcp 65001 > nul
echo 切换后编码:
chcp
pause
执行效果
切换后编码:
Active code page: 65001
请按任意键继续. . .
:: 标签注释
:: 并不是批处理官方定义的注释命令,而是标签的特殊写法(标签以 : 开头,用于 goto 跳转),但因为 :: 不符合标签的命名规则(标签不能以第二个 : 开头),所以解释器会忽略这一行,从而起到注释的效果。
(1)基础使用
@echo off
:: 这是一行注释,不会被执行
echo tensoflow
pause
执行效果
tensoflow
请按任意键继续. . .
注意
::注释不能在 if/for 等块内使用
不能在命令行末尾使用。
rem 标准注释
官方标准的注释命令是rem(全称remark意为"备注")。
(1)基础使用
@echo off
rem 这是一行注释,不会被执行
echo tensoflow
pause
执行效果
tensoflow
请按任意键继续. . .
注意
rem注释能在 if/for 等块内使用
不能在命令行末尾使用。
echo 打印
在控制台窗口中输出文本、变量值、或控制批处理的命令回显功能,简单来说就是打印内容。
(1) 输出普通文本
@echo off
echo 你好,这是echo命令的基础用法
pause
执行效果
你好,这是echo命令的基础用法
请按任意键继续. . .
pause 暂停
pause 命令的主要功能是暂停批处理脚本的执行,并在控制台窗口中显示提示信息,等待用户按下任意键后,脚本才会继续执行后续命令。
(1)基础使用
@echo off
echo 这是执行 pause 前的内容
pause
echo 这是按下任意键后才会显示的内容
pause
执行效果
这是执行 pause 前的内容
请按任意键继续. . .(按下任意键后)
这是按下任意键后才会显示的内容
请按任意键继续. . .
start 运行
运行某个目录下的某一文件
语法
start /d [目录路径] [可执行文件名称]
(1)标准启动
@echo off
rem 第一个""里面是窗口标题,不填时表示为空
rem 第一个""不填都不要省略,因为Bat是按照空格分隔的如果程序路径含空格就会解析路径失败。
start "" "D:\TenSoFlow\Projects\Java_Exe\Reminder\RunReminder\Reminder.exe"
执行效果
会运行D:\TenSoFlow\Projects\Java_Exe\Reminder\RunReminder目录下的Reminder.exe文件
(2)/d 参数启动
@echo off
start /d "D:\TenSoFlow\Projects\Java_Exe\Reminder\RunReminder" Reminder.exe
执行效果
会运行D:\TenSoFlow\Projects\Java_Exe\Reminder\RunReminder目录下的Reminder.exe文件
set 设置变量
语法
# = 前后不能有空格否则空格会被计入变量名/值
set 变量名=变量值
(1)定义/修改自定义变量
@echo off
:: 定义普通变量
set name=tensoflow
set age=18
set address=梦想国度
:: 修改变量值(直接重新赋值即可)
set age=23
:: 输出变量(用%变量名%包裹)
echo 姓名:%name%
echo 年龄:%age%
echo 地址:%address%
pause
执行效果
姓名:tensoflow
年龄:23
地址:梦想国度
请按任意键继续. . .
(2)查看所有变量(系统 + 自定义)
@echo off
echo 所有变量列表:
echo ----------------
set
echo ----------------
pause
执行效果
会显示 PATH、USERNAME、TEMP 等系统变量,以及你自定义的 name、age 等变量
(3)查看指定变量
@echo off
set name=张三
set name1=李四
rem 查看所有以name开头的变量
set name
pause
执行效果
name=张三
name1=李四
请按任意键继续. . .
(4)接收用户输入
@echo off
rem 接收用户输入的姓名和年龄
set /p username=请输入你的姓名:
set /p userage=请输入你的年龄:
rem 输出用户输入的内容
echo 你好,%username%!你的年龄是%userage%岁。
pause
执行效果
请输入你的姓名:tensoflow
请输入你的年龄:18
你好,tensoflow!你的年龄是18岁。
请按任意键继续. . .
(5)set /a 数值计算
@echo off
set num1=10
set num2=3
:: 加法
set /a sum=%num1%+%num2%
:: 减法
set /a sub=%num1%-%num2%
:: 乘法
set /a mul=%num1%*%num2%
:: 除法(取整)
set /a div=%num1%/%num2%
:: 取模(余数)
set /a mod=%num1%%%num2%
echo 10+3=%sum%
echo 10-3=%sub%
echo 10*3=%mul%
echo 10/3=%div%
echo 10%%3=%mod%
set count=0
:: 自增1
set /a count+=1
echo 自增后:%count%
:: 自减1
set /a count-=1
echo 自减后:%count%
pause
执行效果
10+3=13
10-3=7
10*3=30
10/3=3
10%3=1
自增后:1
自减后:0
请按任意键继续. . .
(6)字符串拼接
@echo off
set prefix=Hello
set suffix=World
:: 拼接1:变量+文本
set str1=%prefix%_2025
:: 拼接2:变量+变量
set str2=%prefix% %suffix%
:: 输出 Hello_2025
echo str1=%str1%
:: 输出 Hello World
echo str2=%str2%
pause
执行效果
str1=Hello_2025
str2=Hello World
请按任意键继续. . .
(7)字符串截取
@echo off
:: 长度为11的字符串
set str=abcdefghijk
:: 截取前3个字符(位置0,长度3) 输出 abc
echo 前3个字符:%str:~0,3%
:: 截取从第5个字符开始到末尾(位置4,不写长度)输出 efghijk
echo 从第5个字符开始:%str:~4%
:: 截取最后3个字符(起始位置-3,不写长度)输出 ijk
echo 最后3个字符:%str:~-3%
:: 截取从开头到倒数第2个字符(起始0,长度-2)输出 abcdefghi
echo 到倒数第2个字符:%str:~0,-2%
pause
执行效果
前3个字符:abc
从第5个字符开始:efghijk
最后3个字符:ijk
到倒数第2个字符:abcdefghi
请按任意键继续. . .
(8)字符串替换
@echo off
set path=D:\test\old_folder\file.txt
:: 替换文件夹名称(old_folder → new_folder)
set new_path=%path:old_folder=new_folder%
:: 输出 D:\test\new_folder\file.txt
echo 替换后:%new_path%
:: 删除所有反斜杠(\)
set no_slash=%path:\=%
:: 输出 D:testold_folderfile.txt
echo 无反斜杠:%no_slash%
pause
执行效果
替换后:D:\test\new_folder\file.txt
无反斜杠:D:testold_folderfile.txt
请按任意键继续. . .
if 条件判断
if命令用于根据指定条件是否成立,决定执行不同的命令。
基础语法
# 单条件判断
if 条件 (
条件成立时执行的命令
)
# 双条件判断
if 条件 (
条件成立时执行的命令
) else (
条件不成立时执行的命令
)
# 多条件判断
if 条件1 (
条件1成立时执行
) else if 条件2 (
条件2成立时执行
) else (
所有条件都不成立时执行
)
(1)字符串比较
| 运算符 | 含义 | 示例 |
|---|---|---|
| == | 等于 | if "%str1%"=="abc" |
| neq | 不等于 | if "%str1%" neq "abc" |
(2)数值比较
| 运算符 | 含义 | 示例 |
|---|---|---|
| equ | 等于 | if %num% equ 10 |
| neq | 不等于 | if %num% neq 10 |
| gtr | 大于 | if %num% gtr 10 |
| geq | 大于等于 | if %num% geq 10 |
| lss | 小于 | if %num% lss 10 |
| leq | 小于等于 | if %num% leq 10 |
(3)文件存在性判断
| 语法 | 含义 | 示例 |
|---|---|---|
| if exist 路径 | 判断文件 / 目录是否存在 | if exist test.txt |
| if not exist 路径 | 判断文件 / 目录是否不存在 | if not exist test_folder |
for 循环
基础语法
for %%变量名 in (遍历对象) do (
对每个遍历对象执行的命令
)
(1)基础使用
@echo off
echo 遍历字符串列表:
echo ----------------
:: 遍历括号内的字符串(用空格分隔多个元素)
for %%i in (苹果 香蕉 橙子 葡萄) do (
echo 水果:%%i
)
pause
执行效果
遍历字符串列表:
----------------
水果:苹果
水果:香蕉
水果:橙子
水果:葡萄
请按任意键继续. . .
goto 跳转
goto命令用于跳转到脚本中指定标签(Label)位置,执行标签后的代码,而跳过标签之前(跳转点之后)的代码。
(1)基础使用
@echo off
set /p opt=请选择操作(1-执行功能A,2-执行功能B):
:: 根据输入跳转
if "%opt%"=="1" goto funcA
if "%opt%"=="2" goto funcB
:: 若输入无效,跳转到错误提示
goto error
:: 功能A标签
:funcA
echo 你选择了功能A,正在执行...
echo 功能A执行完成!
:: 执行完跳转到脚本结束,避免执行其他标签
goto end
:: 功能B标签
:funcB
echo 你选择了功能B,正在执行...
echo 功能B执行完成!
:: 跳过错误提示
goto end
:: 错误提示标签
:error
echo 输入无效,请选择1或2!
goto end :: 跳转到结束
:: 脚本结束标签
:end
echo 脚本执行完毕。
pause
执行效果
请选择操作(1-执行功能A,2-执行功能B):1
你选择了功能A,正在执行...
功能A执行完成!
脚本执行完毕。
请按任意键继续. . .
title 窗口标题
title用于设置当前CMD控制台窗口的标题栏文本。
(1)基础使用
@echo off
:: 设置窗口标题
title tensoflow
pause
执行效果
CMD窗口显示tensoflow标题
color 控制台颜色
color 命令用于设置当前 CMD 控制台窗口的背景色和前景色(文字颜色),默认情况下控制台是黑底白字。它的核心价值是:
- 区分脚本的不同执行阶段(比如错误提示用红底黄字,正常输出用黑底绿字);
- 提升脚本界面的可读性,避免单调的黑白配色。
(1)基础使用
@echo off
title 颜色设置示例
:: 1. 黑底绿字(背景0,前景2)- 正常输出
color 02
echo ======================
echo 正常执行:黑底绿字
echo ======================
pause
:: 2. 黑底亮红色(背景0,前景C)- 错误提示
color 0C
echo ======================
echo 错误提示:黑底亮红色
echo ======================
pause
:: 3. 蓝底黄色(背景1,前景6)- 警告提示
color 16
echo ======================
echo 警告提示:蓝底黄色
echo ======================
pause
:: 恢复默认配色(黑底白字)
color
echo 已恢复默认配色(黑底白字)
pause
taskkill 结束进程
强制结束正在运行的进程。
(1)按照进程名结束单个进程
@echo off
echo 正在结束Reminder.exe进程...
:: 强制结束Reminder.exe进程
:: /f 强制结束 /im 指定进程名
taskkill /f /im Reminder.exe
pause
小贴士
此处进程名就是任务管理器里存在的进程名或映像名称对应的.exe文件名
timeout 休眠
用于让脚本暂停执行指定时长。
基础语法
# /t 必选参数 指定等待的秒数
# /nobreak 可选参数 禁用按键跳过功能
# > nul 可选参数 屏蔽timeout自带的倒计时提示
timeout /t [等待秒数] /nobreak > nul
(1)基础使用
@echo off
echo ======================
echo 脚本将等待5秒后继续执行(按任意键可跳过)
echo ======================
:: 等待5秒,允许按键跳过
timeout /t 5
echo 等待结束,脚本继续执行!
pause
执行效果
======================
脚本将等待5秒后继续执行(按任意键可跳过)
======================
等待 3 秒,按一个键继续 ...
