BAT (批处理) 语法
1. 注释
注释用于解释代码的功能或逻辑,帮助他人理解脚本。可以使用 REM
或 ::
来添加注释。
单行注释:
REM This is a single-line comment
多行注释:
REM This is a
REM multi-line comment
或者:
:: This is a
:: multi-line comment
解释:
REM
和::
都可以用于注释,但::
注释更简洁且高效,尤其在需要大量注释时。REM
更多是历史遗留的格式。
2. 变量
BAT脚本中的变量用来存储数据,可以是字符串、数字或其他类型的数据。
定义和赋值:
set var=Hello World
使用变量:
echo %var%
计算和运算:
BAT脚本中支持简单的算术计算。使用 set /a
可以进行算术操作:
set /a var1=5
set /a var2=3
set /a result=%var1% + %var2%
echo %result%
环境变量:
Windows 提供了许多预定义的环境变量,可以直接使用,例如 %PATH%
或 %USERPROFILE%
:
echo %USERPROFILE%
3. 控制流程
控制流程语句帮助你决定如何根据条件执行不同的命令。
IF 语句
IF
语句用于检查条件并根据条件执行不同的命令。可以与 exist
、==
、not
等结合使用:
if exist file.txt (
echo file.txt exists.
) else (
echo file.txt does not exist.
)
使用 ==
比较字符串:
set var=Hello
if "%var%" == "Hello" (
echo The variable is Hello
)
使用 NOT
进行取反:
if not exist file.txt (
echo file.txt does not exist.
)
FOR 语句
FOR
循环在BAT脚本中非常常用,尤其是处理文件、目录或字符串。
基本的 FOR
循环:
for %%a in (file1.txt file2.txt file3.txt) do (
echo %%a
)
使用 FOR /f
读取命令输出:
for /f %%a in ('dir /b') do (
echo %%a
)
/b
参数表示只列出文件名。
使用 FOR /l
循环执行数字范围:
for /l %%i in (1,1,5) do (
echo %%i
)
这里的 1
是起始值,1
是步长,5
是结束值。
WHILE 循环
BAT本身不直接支持 while
循环,但可以使用 goto
来模拟:
set /a i=1
:loop
echo %i%
set /a i+=1
if %i% leq 10 goto loop
4. 常用命令
ECHO 命令
echo
用于输出文本信息到控制台。
echo Hello, World!
输出空行:
echo.
关闭回显:
echo off
echo off
关闭命令回显,通常用于脚本的开头以避免显示命令本身。
@echo off :: 常用的写法,不显示当前命令行
DIR 命令
dir
用于列出当前目录或指定目录的文件和文件夹。
dir :: 显示当前目录的文件和文件夹
dir C:\Windows :: 显示C盘Windows目录内容
CALL 命令
call
用于调用其他批处理脚本:
call another_script.bat
START 命令
start
用于启动一个新的命令行窗口,执行指定的程序或脚本。
start notepad.exe
start "" "C:\Program Files\MyApp\app.exe"
PAUSE 命令
pause
用于暂停脚本的执行,通常用于等待用户按下任意键后继续:
pause
5. 函数
在BAT脚本中,你可以通过标签(Label)和 call
命令来实现函数的定义与调用。
定义和调用函数:
call :myFunction
exit /b
:myFunction
echo This is my function.
exit /b
:myFunction
定义了一个函数(标签)。call :myFunction
调用该函数。
退出函数并返回:
exit /b
用于退出函数或脚本,/b
表示退出当前脚本的批处理流程,不会终止整个脚本。
获取函数返回值:
call :addNumbers 5 10
echo Result: %result%
exit /b
:addNumbers
set /a result=%1+%2
exit /b
%1
和%2
是传递给函数的参数。set /a
用于执行算术运算。
6. 错误处理与调试
使用 ERRORLEVEL
处理命令的返回值:
ERRORLEVEL
用于检查上一个命令的退出状态。ERRORLEVEL
为0表示成功,非0表示错误。
command
if %ERRORLEVEL% neq 0 (
echo Command failed!
) else (
echo Command succeeded!
)
打印调试信息:
使用 echo
打印调试信息,帮助调试BAT脚本:
echo Current value of var is: %var%
使用 @echo
禁止某些命令回显:
@echo off
@
符号前缀用于防止显示当前命令行,通常用于脚本开始时。
7. 示例脚本:自动备份文件
这是一个简单的BAT脚本示例,用于自动备份文件:
@echo off
set source=C:\Users\MyUser\Documents
set destination=D:\Backup
if not exist %destination% (
mkdir %destination%
)
xcopy %source%\*.txt %destination% /Y /E
echo Backup complete!
pause
解释:
set source
和set destination
用于定义源目录和目标目录。xcopy
用于复制文件。/Y
参数用于覆盖现有文件,/E
参数用于复制所有子目录(包括空目录)。
8. 扩展变量与参数使用
变量的延迟扩展
有时候在循环或条件语句中使用变量,可能会遇到值更新不及时的问题。为了解决这个问题,可以使用 延迟变量扩展。可以通过 setlocal enabledelayedexpansion
启用延迟扩展。
延迟扩展的使用:
@echo off
setlocal enabledelayedexpansion
set var=10
for /l %%i in (1,1,5) do (
set /a var+=1
echo !var!
)
endlocal
解释:
setlocal enabledelayedexpansion
:启用延迟扩展。- 在脚本中,通过
!var!
来访问变量,而不是%var%
,这样可以确保变量的值实时更新。
参数的使用
在BAT脚本中,传递给脚本的参数可以通过 %1
, %2
, … %9
来访问。如果参数超过9个,可以通过 shift
来移动参数,方便访问更多的参数。
@echo off
echo First parameter: %1
echo Second parameter: %2
echo Third parameter: %3
shift
echo After shifting, first parameter is: %1
解释:
shift
命令将所有参数向左移动一位,允许你访问第10个及更多的参数。
9. 进程管理与系统操作
获取当前任务列表
通过 tasklist
命令可以列出所有当前运行的进程,并且可以将其输出到文件中进行分析。
tasklist > tasklist.txt
终止进程
可以通过 taskkill
命令结束指定的进程。例如,结束一个名为 notepad.exe
的进程:
taskkill /f /im notepad.exe
/f
强制终止进程/im
指定进程名称
启动程序或脚本并等待其结束
使用 start
启动程序时,可以选择是否等待程序执行完毕:
start /wait notepad.exe
echo Notepad has closed.
/wait
参数告诉批处理脚本等待notepad.exe
执行完毕后,再继续执行后面的命令。
检查进程是否正在运行
如果你需要检查某个进程是否正在运行,可以使用 tasklist
和 findstr
命令结合来实现:
tasklist | findstr /i "notepad.exe" >nul
if %ERRORLEVEL% equ 0 (
echo Notepad is running.
) else (
echo Notepad is not running.
)
findstr
用来匹配tasklist
的输出,如果进程存在,ERRORLEVEL
为0,否则为1。
10. 文件与目录操作
创建目录并确保目录存在
可以使用 mkdir
创建目录,但有时可能需要先检查目录是否存在。可以通过条件语句和 if not exist
来确保目录的存在:
if not exist "C:\Backup" (
mkdir "C:\Backup"
)
删除文件或目录
使用 del
删除文件,rmdir
删除目录。
删除文件:
del "C:\Temp\file.txt"
删除目录:
rmdir /s /q "C:\Temp\folder"
/s
表示删除目录及其所有内容/q
表示安静模式,删除时不提示确认
批量重命名文件
使用 ren
命令批量重命名文件:
for %%f in (C:\Files\*.txt) do (
ren "%%f" "%%~nf_backup%%~xf"
)
%%~nf
表示文件名,%%~xf
表示文件扩展名。
文件复制与备份
通过 xcopy
或 robocopy
进行文件复制,robocopy
更适用于大文件和复杂的目录结构。
xcopy C:\Data D:\Backup /E /H /Y
/E
复制所有子目录,包括空目录/H
复制隐藏文件/Y
覆盖文件时不提示确认
robocopy
适用于大规模的复制任务,提供更高效和可靠的文件复制功能:
robocopy C:\Data D:\Backup /E /Z /MT:4
/Z
启用可恢复模式/MT:4
启用 4 个线程进行并行复制
11. 用户交互
提示用户输入
set /p
用于提示用户输入,并将输入值存储在变量中。
@echo off
set /p username=Enter your username:
echo Your username is %username%.
显示确认对话框
你可以使用 choice
命令来显示一个确认对话框,让用户选择不同的选项:
@echo off
echo Do you want to continue? (Y/N)
choice /c YN /m "Please choose Y or N"
if errorlevel 2 (
echo You chose No.
) else (
echo You chose Yes.
)
/c
定义可选的键/m
显示提示消息errorlevel
判断用户选择的键
12. 网络操作
测试网络连接
使用 ping
命令测试网络连接是否可达:
ping www.google.com
- 可以通过
> nul
将输出隐藏,仅查看命令的结果:
ping www.google.com > nul
if %ERRORLEVEL% equ 0 (
echo Connection successful.
) else (
echo Connection failed.
)
下载文件
通过 bitsadmin
或 curl
下载文件:
使用 bitsadmin
:
bitsadmin /transfer mydownloadjob /download /priority high http://example.com/file.zip C:\Downloads\file.zip
使用 curl
:
curl -O http://example.com/file.zip
13. 自动化脚本示例
自动化备份脚本
这是一个用于自动化备份的BAT脚本示例:
@echo off
set source=C:\Users\MyUser\Documents
set backup_dir=D:\Backup\%DATE:~-4,4%%DATE:~4,2%%DATE:~7,2%
set log_file=D:\Backup\backup_log.txt
if not exist %backup_dir% (
mkdir %backup_dir%
)
xcopy %source%\* %backup_dir%\ /E /H /Y
echo Backup completed at %DATE% %TIME% >> %log_file%
echo Backup completed.
pause
解释:
set source
:定义源目录。set backup_dir
:定义备份目录,使用当前日期作为目录名(%DATE%
返回当前日期,格式如YYYY-MM-DD
)。xcopy
:执行文件备份,/E
复制所有子目录,包括空目录,/H
复制隐藏文件,/Y
自动覆盖。echo
:记录备份时间到日志文件中。
14. 脚本调试技巧
打印变量的值
可以通过 echo
输出变量值来帮助调试脚本:
echo The current value of var is: %var%
使用 set
显示所有环境变量
可以使用 set
显示当前所有环境变量及其值:
set
启用命令回显
通过 echo on
,启用命令回显,以查看每一条命令的执行过程:
echo on
调试模式
将 setlocal
替换为 setlocal enabledelayedexpansion
,可以调试延迟变量扩展中的问题。
setlocal enabledelayedexpansion