一、简介

(一)什么是批处理文件

​ 批处理文件又叫做batch文件,是包含了一系列dos命令的可运行文件,通常用于自动化的重复性任务,文件扩展名为.bat.cmd,当在cmd中运行时,操作系统会按照顺序依次执行批处理文件中的命令和脚本。

(二)创建一个批处理文件

​ 新建一个记事本文件,然后在其中输入以下内容:

@echo off
echo Hello World!
pause

​ 然后ctrl+s保存,修改.txt文件的后缀为.bat,文件的图标会自动改变image-20250315184131753,然后双击运行即可。

image-20250315184158501

二、基本命令

​ 以下是一些常用的批处理脚本命令:

命令 说明
echo 显示文本或控制命令回显状态
pause 暂停脚本运行,并等待用户的按键以继续
rem 注释,这一行不会被执行
set 定义或显示环境变量
if 条件判断
for 循环
call 调用另一个批处理脚本或命令
goto 跳转到指定的标签位置,更改脚本执行的流程
start 启动一个新窗口运行指定命令
exit 退出脚本并关闭当前窗口

三、基本语法

(一)关闭回显

​ 默认情况下,批处理文件会显示执行的每一条命令。

​ 在脚本开头添加 @echo off 可关闭命令回显,仅显示输出结果:

@echo off
echo hello!
pause

(二)注释

​ 注释是用于解释代码的文本,运行时不会被执行。使用 ::rem 来标记注释。

rem 这一行不会被执行和显示
:: 这一行也不会被执行和显示
echo 这一行会被执行和显示

(三)变量

​ 批处理文件支持自定义变量,格式为 set 变量名 = 变量,在脚本中用%变量名%来表示该变量,示例:

@echo off
set name = 张三
echo 欢迎,%name%
pause

​ 批处理文件还可以直接调用系统环境变量,示例:

@echo off
echo 当前用户的用户名是:%USERNAME%
pause

set拥有/p参数,该参数用于提示用户输入,并将用户的输入赋值给变量

set /P username=请输入您的用户名:

(四)条件判断

​ 通过if语句来实现条件判断:

@echo off
set /p age=请输入你的年龄:
if %age% GEQ 18 (
echo 你已成年!
pause
) else (
echo 你未成年!
pause
)
pause
@echo off
set myfile = 文件名.txt
if exist %myfile% (
echo 文件%myfile%存在
pause
) else (
echo 文件%myfile%不存在
pause
)
pause

(五)循环语句

for语句用于遍历集合中的元素(如文件、数字等)。

​ 示例1,遍历文件夹中的所有 .txt 文件:

@echo off
for %%f in (*.txt) do (
echo 找到文件:%%f
)
pause

​ 实例2,循环处理文件:

@echo off
for %%i in (file1.txt file2.txt file3.txt) do (
echo 正在处理%%i
)
pause

(六)文件加入执行参数

​ 批处理文件的运行命令后可以接受参数,在脚本中参数用%1%2等表示。

​ 示例1,接受两个参数

# 在cmd中输入以下运行的代码
test.bat 参数1 参数2
@echo off
echo 第一个参数是:%1
echo 第二个参数是:%2
pause

(七)文件操作

​ 操作文件是批处理脚本的常用功能。

1.创建目录

@echo off
set newfolder = 目录名字
mkdir %newfolder%
echo 目录%newfolder%已创建
pause

2.创建文件

​ 创建txt文件和空文件:

@echo off
set newfile = 文件名字
echo This is a new file. > %newfile%
pause
@echo off
set newfile = 文件名字
type nul > %newfile%
pause

3.删除文件和目录

rmdir有参数可以选择:/S-删除子目录和文件,/Q-安静模式,不要求确认是否删除。

@echo off
del myfile.txt
rmdir /S /Q myfolder
echo 文件和目录已删除
pause

4.重命名文件

@echo off
ren oldfile.txt newfile.txt
echo 文件已重命名
pause

5、将输出写入文件

​ 这样的操作会覆盖原文件内容。

@echo off
echo 这是输出内容 > output.txt
echo 输出已写入output.txt
pause

6、将文件内容显示到屏幕

@echo off
type output.txt
pause

7、将输出追加到文件

​ 这样的操作不会覆盖原文件内容,而是追加到末尾。

@echo off
echo 追加内容 >> output.txt
pause

(八)系统和进程控制

1.控制系统进程

​ 批处理文件可以用于启动、停止 Windows 服务,以及控制进程的执行。下面例子为启动和关闭windows更新服务

@echo off
net start wuauserv
echo Windows Update 服务已启动
pause
net stop wuauserv
echo Windows Update 服务已停止
pause

2.执行外部程序和脚本

@echo off
start notepad.exe
echo 已启动记事本。
pause
@echo off
call otherbatch.bat
echo 已调用其他批处理文件。
pause

(九)使用计划任务

@echo off
SCHTASKS /CREATE /TN "MyTask" /TR "C:\Path\To\yourbatch.bat" /SC DAILY /ST 10:00
echo 已创建计划任务,每天在10:00运行。
pause

SCHTASKS /CREATE 创建一个新的计划任务,指定任务名称、运行的批处理文件、执行频率和时间。

/TN “MyTask”指定任务的名称为 “MyTask”。任务名称必须是唯一的,如果已有同名任务,则会失败。

/TR “C:\Path\To\yourbatch.bat”指定在任务执行时要运行的程序或脚本的完整路径。

/SC DAILY设置任务的调度方式为“每日”执行。也可以使用其他选项,例如 WEEKLY(每周)或 ONCE(一次性)。

/ST 10:00指定任务每天在 10:00 AM 执行。时间格式为 HH:MM,24小时制。

(十)错误处理

​ 可以使用 ERRORLEVEL 是否等于1,来检查上一个命令的返回值,以决定下一步的操作。

@echo off
del myfile.txt
IF ERRORLEVEL 1 (
echo 文件删除失败。
) ELSE (
echo 文件删除成功。
)

(十一)跳转

​ 使用 GOTO 语句跳转到指定的标签,会立即转到该标签所在的位置。

​ 标签用:开头作为标识符。

@echo off
echo 开始执行脚本
:start
echo 这是一个循环部分
set /p userInput="输入 'exit' 退出循环: "
if /i "%userInput%"=="exit" goto end
echo 你输入的是: %userInput%
goto start
:end
echo 脚本已结束

​ 以上代码中if /i参数的意思是不区分大小写。

四、应用:设置hexo自动上传的脚本

​ 要求:每次都要在git bash中输入以下三条命令才能更新网站的笔记,编写一个bat脚本,一键上传。

hexo clean
hexo generate
hexo deploy

​ 写好的脚本如下所示:

@echo off
chcp 65001 >nul
setlocal

rem 获取当前批处理文件的目录
set "currentDir=%~dp0"

rem 更改到当前目录
cd /d "%currentDir%"

rem 使用 Git Bash 的完整路径运行命令
"C:\Program Files\Git\bin\bash.exe" -c "hexo clean; hexo generate; hexo deploy" 2> error.log

rem 检查错误日志文件是否存在以及大小
set "errorFile=%currentDir%error.log"
if %errorlevel% neq 0 (
if exist "%errorFile%" (
echo.
echo 执行过程中发生错误:
type "%errorFile%"
del "%errorFile%"
) else (
echo.
echo 未知错误发生。
)
pause
exit /b 1
)

rem 成功执行后的操作
echo 网站一键更新成功,程序将在3秒后退出...
timeout /t 3 /nobreak

rem 删除错误日志文件(如果存在)
if exist "%errorFile%" del "%errorFile%"

endlocal
exit /b 0

​ 以下是对每一行代码的详细解释:

chcp 65001 >nul
  • chcp 65001:将代码页设置为UTF-8(代码页65001),以确保脚本能够正确处理非ASCII字符。
  • >nul:将命令输出重定向到nul,隐藏输出信息。
setlocal
  • setlocal:启动局部环境更改,确保脚本中的环境变量不会影响到外部环境。
set "currentDir=%~dp0"
  • set "currentDir=%~dp0":设置currentDir变量为当前批处理文件所在的目录。%~dp0是一个批处理参数修饰符,表示脚本的完整路径的目录部分。
cd /d "%currentDir%"
  • cd /d "%currentDir%":切换到currentDir指定的目录。
"C:\Program Files\Git\bin\bash.exe" -c "hexo clean; hexo generate; hexo deploy" 2> error.log
  • "C:\Program Files\Git\bin\bash.exe" -c "hexo clean; hexo generate; hexo deploy":使用Git Bash执行Hexo命令。-c参数用于指定要执行的命令字符串。
  • 2> error.log:将标准错误输出重定向到error.log文件。
set "errorFile=%currentDir%error.log"
  • set "errorFile=%currentDir%error.log":设置errorFile变量为错误日志文件的完整路径。
if %errorlevel% neq 0 (
if exist "%errorFile%" (
echo.
echo 执行过程中发生错误:
type "%errorFile%"
del "%errorFile%"
) else (
echo.
echo 未知错误发生。
)
pause
exit /b 1
)
  • if %errorlevel% neq 0:检查上一个命令的退出代码。如果不等于0,表示有错误发生。

  • if exist "%errorFile%":检查错误日志文件是否存在。

  • type "%errorFile%":显示错误日志文件的内容。

    • del "%errorFile%":删除错误日志文件。
  • pause:暂停脚本执行,等待用户按键继续。

  • exit /b 1:退出脚本并返回错误代码1。

timeout /t 3 /nobreak
  • timeout /t 3 /nobreak:暂停3秒,不允许用户中断。
if exist "%errorFile%" del "%errorFile%"
  • if exist "%errorFile%" del "%errorFile%":如果错误日志文件存在,则删除它。
endlocal
  • endlocal:结束局部环境更改,恢复之前的环境变量状态。
exit /b 0
  • exit /b 0:退出脚本并返回成功代码0。