BAT 基础语法

BAT脚本是Windows批处理文件的扩展名,用于集合多个命令进行批量执行。文章介绍了BAT脚本中的注释方法(REM和双冒号),变量的定义与使用,以及控制流程语句如IF、FOR和WHILE。此外,还讲解了常见的命令如ECHO、DIR、CALL、START,以及如何在BAT脚本中定义和调用函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 sourceset 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 执行完毕后,再继续执行后面的命令。

检查进程是否正在运行

如果你需要检查某个进程是否正在运行,可以使用 tasklistfindstr 命令结合来实现:

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 表示文件扩展名。

文件复制与备份

通过 xcopyrobocopy 进行文件复制,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.
)

下载文件

通过 bitsadmincurl 下载文件:

使用 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值