前言
在日常操作中,BAT脚本(Batch Script)是 Windows 系统中一种强大而简单的自动化工具。它通过将多个命令组织成脚本文件,帮助我们完成重复性任务、批量操作、系统配置等,极大提高效率。如果你对 BAT 脚本一知半解,或想快速掌握其精髓,这篇介绍就是为你准备的!
一、Windows脚本基本知识
1、了解扩展名
Windows脚本扩展名其实有两个:dat和cmd 。它们在大部分情况下可以互换使用,但也有一些细微的差异。基本语法是相同的,因此,只要会dat脚本,基本就会cmd脚本。这里简单描述一下不同点:
| 对比项 | .bat | .cmd |
|---|---|---|
| 适用范围 | 兼容早期 DOS 和 Windows 系统 | 专用于 Windows NT 系列系统(如 Windows 2000 及更高) |
| 变量处理 | 在某些情况下与 DOS 兼容,变量处理可能有不一致 | 仅适用于 Windows NT 环境,变量处理更标准化 |
| 命令解析优先级 | 在某些旧系统中可能存在兼容性问题 | 在 NT 系列系统中,.cmd 优先于 .bat 执行 |
| 历史背景 | DOS 和早期 Windows 系统的默认批处理文件扩展名 | Windows NT 系列引入的扩展名,增强兼容性 |
| 兼容性 | 支持旧的 DOS 命令,如 CALL |
专为 NT 命令集设计,支持更现代化的语法 |
另外,powershell也是Windows脚本。它是cmd的扩展,更强大的存在,跨平台,能够兼容cmd所有指令,只是语法(如for)是不兼容的,但是语法更简洁,而且还兼容Linux指令。因此,bat语法还是需要单独学习的,后面转powershell也不难,后续还会单独讲powershell。
2、脚本的编程方式
脚本的使用方式一般是在Windows上进行的,创建一个txt文件,更改后缀为bat,通过txt打开并编程,保存后双击文件运行即可。
有一些好用的第三方工具,可以编辑脚本后直接运行,如Notepad++ 、BatchCompiler等,喜欢用哪个就用哪个,重要的是玩起来。
3、cmd指令不区分大小写
cmd指令不区分大小写,这样输入是等价的: cmd == Cmd ==CMD == CmD。
4、空格不能乱加
在批处理(.bat)脚本中,空格的使用是有特定规则的,不能随意添加,如变量赋值。
二、bat脚本语法基础
官方文档:cmd | Microsoft Learn
1、注释
:: 这是一个注释REM 这也是一个注释
2、变量赋值与取值
set a=Johnecho %a%
3、输入、输出与暂停
pause命令用于暂停批处理文件的执行,并提示用户按任意键继续。
set /P a= echo %a% pause
4、关闭命令回显
即@echo off 的效果,用于关闭命令回显功能。
@echo offset /P a=echo %a%pause
5、清屏
即cls的效果,将该指令之前的打印信息清空。
@echo offset /P a=clsecho %a%pause
6、条件语句
简单的if语句,如:if "%a%"=="John" echo Hi, John!
@echo offset /P a=clsecho %a%if "%a%"=="John" echo Hi, John!pause
7、循环语句
@echo offfor %%i in (1 2 3) do echo %%ipause
8、重定向
覆盖: > ;追加:>> 。
@echo offecho Hello > C:UsersyeqinDesktoptestoutput.txtdir >> C:UsersyeqinDesktoptestoutput.txtpause
9、切换路径与当前路径
cd可以切换路径,但是不能直接切换到其他盘符路径。准确的说,cd 也能切换盘符,需要加上 /d 选项。
cd ..echo %cd%
10、切换盘符
直接输入盘符标识。
C:
11、错误处理
检查上一个命令的执行状态,通过 %ERRORLEVEL% 判断。
invalid_command是一个不存在的指令,因此会触发错误,%ERRORLEVEL% 的值会变成非零(通常为 1)。
invalid_commandif %ERRORLEVEL%==0 echo Successif %ERRORLEVEL% neq 0 echo Error occurred
12、一行中编写多条指令
& 将多条命令串联在一起,无论前一条命令是否成功,都会执行下一条命令。
echo Hello & echo World
&&:前一条命令成功(返回值为 0)时,执行后一条命令。
dir && echo Directory listed successfully
| 将前一条命令的输出作为下一条命令的输入。
dir | find "test"
||:前一条命令失败(返回值非 0)时,执行后一条命令。
dir nonexistent_folder || echo Failed to list directory
13、函数与标签
bat没有函数概念,只有标签概念,只能简单使用类似函数的部分功能。
@echo off:: 主程序echo Starting the script...:: 调用add函数,传递两个参数call :add 5 10echo The sum is %RESULT%:: 调用greet函数,传递一个参数call :greet Johnpausegoto :EOF:: 函数add:add:: 第一个参数为%1,第二个参数为%2set /a RESULT=%1+%2goto :EOF:: 函数greet:greet:: 输出传递的第一个参数echo Hello, %1!goto :EOF
14、模块化与call
仅支持运行bat文件,不支持调用其他文件中的标签。
@echo offcall C:UsersyeqinDesktopother.batpause
7595