一、简介
(一)什么是批处理文件
批处理文件又叫做batch文件,是包含了一系列dos命令的可运行文件,通常用于自动化的重复性任务,文件扩展名为.bat
或.cmd
,当在cmd中运行时,操作系统会按照顺序依次执行批处理文件中的命令和脚本。
(二)创建一个批处理文件
新建一个记事本文件,然后在其中输入以下内容:
@echo off echo Hello World! pause
|
然后ctrl
+s
保存,修改.txt
文件的后缀为.bat
,文件的图标会自动改变
,然后双击运行即可。
二、基本命令
以下是一些常用的批处理脚本命令:
命令 |
说明 |
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
set "currentDir=%~dp0"
cd /d "%currentDir%"
"C:\Program Files\Git\bin\bash.exe" -c "hexo clean; hexo generate; hexo deploy" 2> error.log
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 )
echo 网站一键更新成功,程序将在3秒后退出... timeout /t 3 /nobreak
if exist "%errorFile%" del "%errorFile%"
endlocal exit /b 0
|
以下是对每一行代码的详细解释:
chcp 65001
:将代码页设置为UTF-8(代码页65001),以确保脚本能够正确处理非ASCII字符。
>nul
:将命令输出重定向到nul
,隐藏输出信息。
setlocal
:启动局部环境更改,确保脚本中的环境变量不会影响到外部环境。
set "currentDir=%~dp0"
:设置currentDir
变量为当前批处理文件所在的目录。%~dp0
是一个批处理参数修饰符,表示脚本的完整路径的目录部分。
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
:暂停3秒,不允许用户中断。
if exist "%errorFile%" del "%errorFile%"
|
if exist "%errorFile%" del "%errorFile%"
:如果错误日志文件存在,则删除它。
endlocal
:结束局部环境更改,恢复之前的环境变量状态。