BAT(批处理)学习笔记总结
在这里记录一下BAT的基础指令学习总结,供日后回忆,也给和我一样是小白们一个学习的开端思路。
背景
工作中, 日常中经常有些繁琐简单的工作,想做个工具集供我使用。选择它的原因是环境问题,测试环境设备是一个不联网的Windows系统,也不想添加其他依赖等等环境。
自己编写脚本时,如果想在脚本里添加中文,记得把”文件另存为成”ANSI“编码格式“,不然中文会显示乱码,这是新手常遇到的问题,如果设置UTF-8,则需要在脚本中一开始进行预处理环境设置
chcp 65001 > null
第一节:批处理常用指令介绍
1、REM 和 ::
2、ECHO 和 @
3、PAUSE
4、TITLE
5、ERRORLEVEL
6、COLOR
7、GOTO 和 :
8、START
9、set用法与变量延迟
- 语句注释
rem命令行注释,可以回显(语句会在命令行中显示);
::两个冒号,效果同上,但不会回显。(冒号后加任意非字母数字字符都可起到注释作用) - 打印回显及输出
echo后加内容即输出该内容,如:echo "jiujiu!";
echo.换行命令,即echo后加一个点
echo指令有点类似Python语言print打印内容或者变量的值等一些作用,但是echo除了可以打印我们想输出的文字或者变量值的功能之外,还有一些小功能。
@echo "@禁止此信息回显"
echo [on/off]:打开/关闭回显功能
echo [context]:输出提示信息
echo off:关闭DOS提示符的显示,使屏幕只留下一个下划线形状的光标,再输入echo on即可打开DOS提示符的显示
echo.:输出一个空行,这里的.和echo之间不要有空格,其实除了echo.有这个效果,echo+、echo-、echo*、echo,都可以
echo [文件内容] > [文件名]:建立新文件
echo [文件内容] >> [文件名]:新增文件内容
- 暂停
pause暂停,命令行中出现"请按任意键继续...",也可自定义暂停时的文本,如下:
@rem "不更改pause的提示语"
@echo 第一个暂停
@pause
@echo -----------分割线-----------
@rem "更改暂停的提示语"
@echo 这是第二个暂停
@echo "请按enter退出脚本"&pause > nul
- 设置标题title
@echo off
::title设置标题
title 我测试一下!
pause
- ERRORLEVEL指令含义是“程序状态返回码”,返回上一条指令执行状态码,0 代表正常,其它数字代表错误。
@echo off
rem "执行正常"
echo "啦啦啦"
echo 命令执行状态码:%errorlevel%
pause
rem "执行错误"
/? echo
echo 命令执行状态码:%errorlevel%
pause
- COLOR指令设置控制台的前景色和背景色
使用指令"color /?",即可查看color的颜色表
颜色属性由两个十六进制数字指定 -- 第一个
对应于背景,第二个对应于前景。每个数字
可以为以下任何值:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
- goto语句跳转,内部标记跳转
@echo off
:start
set /a var +=1
echo 打印变量的值:%var%
if %var% leq 4 goto start
pause
- start外部程序调用
@echo off
echo "调用外部程序"
:: 打开D盘
start D:\
echo "按空格,继续"
echo "直接运行外部修改控制台标题名称程序"
start /wait .\example_title.bat
echo "调用完毕"
echo "执行本脚本程序"
pause
- set用法之接收用户输入数据
@echo off
set /p param=请输入参数param值:
echo %param%
pause
set定义变量和延迟赋值,注意这个机制,真的是无语到了
::输出为1
@echo off
set a=1
set a=2&echo %a%
pause
注意:在运行“set a=2&echo %a%”之前,会先整句读取该语句并做了预处理,意思就是已经对变量a赋了值,那么%a%值为1,为解决该问题,批处理设计了变量延迟。也就是说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,具体实现:
:: 开启变量延迟
setlocal enabledelayedexpansion
set a=2&echo !a! REM 注意:'变名=值'中间不要有空格
第二节、常用特殊符号
1、%:批处理变量引导符
2、>、>>、<:重定向符
3、|:命令管道符
4、^:转义字符
5、&、&&、||:组合命令
6、"":字符界定符
7、,:逗号
8、;:分号
9、():括号
10、!:感叹号
11、*、?:文件通配符
- %不算命令,它只是批处理中的参数而已,引用变量用%variableName%,也可以用来添加行内注释,格式:%注释内容%(作为行内注释时,不能出现重定向符和管道符)
@echo off
set var=10
echo 引用变量的值
echo %var%
echo 行内注释
echo %行内注释片段% %var%
pause
- >、>>、<:重定向符
>、>>:输出重定向命令
>:将命令发送到文件或者设备(有些命令输出重定向,比如错误信息)
>>:将命令输出添加到文件结尾,而不删除文件中已有的内容
<:输入重定向命令
><:从文件而不是键盘上获取命令所需的输入,遇到回车符就会停止输入
@echo off
echo ">的示例"
echo 创建一个txt文件 > .\test.txt
echo.
echo 文件内容: & type .\test.txt
echo ---------分割线---------
echo ">>的示例"
echo 向test.txt文件中新增内容 >> .\test.txt
echo.
echo 新增后的文件内容: & type .\test.txt
echo ---------分割线---------
echo "<的示例"
set /p var="" < .\test.txt
echo 重输入给变量的值:%var%
pause
- *文件通配符:代表全部字符
?文件通配符:代表单个字符
第三节、常用命令详解
一、For命令基本格式
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关
FOR命令有4个参数“/D、/L、/R、/F”
二、FOR参数
- 参数 /D详解
定义:FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配
解析:如果集合(set)包含通配符(“*”和“?”),将对与集合(set)相匹配的每一个目录(不是指目录中的文件组)执行指定的Commoand,这个参数主要用于目录搜索,不会搜索文件
通俗讲:按条件找目录名
示例:
echo C盘根目录下所有目录名:
for /d %%i in (c:\*) do (
echo %%i
)
pause
- 参数 /R详解
定义:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树
解析:通过/D参数知道,/D参数能显示指定路径或者当前路径下的目录名,/R也是跟目录有关,/R参数可以把指定路径下或者当前目录下的文件名全部读取,注意是文件名,不是目录名
通俗讲:按条件找目录下的文件名
注意:
1、集合(set)中文件名如果包含通配符(“*”和“?”),则列举/R参数指定的目录及其下面的所有子目录中与集合(set)相符合的所有文件,不相符文件的目录则不列举
2、如果集合(set)中为具体文件名,不包含通配符,则枚举该目录树(即枚举该目录及其下面的所有子目录),而不管集合(set)中指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件
示例1:
@echo off
echo 搜索D盘根目录和子目录子所有以.bat结尾的文件:
for /r d:\ %%i in (*.bat) do (
echo %%i
)
echo --------------------------------------------
echo 搜索当前目录及其子目录下所有以.txt结尾的文件:
for /r %%i in (*.txt) do (
echo %%i
)
pause
- 参数 /L详解
定义:FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列1 2 3 4 5
解析:使用迭代变量设置起始值(start),然后逐步执行一组范围值,直到该值超过所设置的终止值(end)。/L参数将通过对起始值与终止值进行比较来执行迭代变量,如果起始值小于终止值,就会执行指定给出的命令,如果迭代变量超过终止值,则命令解释程序退出循环。可以使用负的步进值(step)以递减数值的方式来逐步执行此范围内的值
通俗讲:需要定义循环起始值、循环单次增加值、循环结束值
示例:
@echo off
echo 正的步进值(step)循环结果:
for /l %%i in (1, 1, 5) do (
echo %%i
)
echo --------------------------------------------
echo 负的步进值(step)循环结果:
for /l %%i in (5, -1, 1) do (
echo %%i
)
pause
- 参数 /F详解
定义:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
解析:结合示例讲解
(1)FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
(2)FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
(3)FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
选项(options)参数:
eol=c :指一个行注释字符的结尾(就一个)
skip=n:指在文件开始时忽略的行数
delims=xxx:指分隔符集。这个替换了空格和制表符的默认分隔符集
tokens=x,y,m-n:指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式 为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后。如2-5,意思是需要第二个至第五个匹配到的
@echo off
rem 创建测试文件
echo ;注释行,临时文件用完删除 > .\test.txt
echo 11段 12段 13段 14段 15段 16段 >> .\test.txt
echo 21段,22段,23段,24段,25段,26段 >> .\test.txt
echo 31段-32段-33段-34段-35段-36段 >> .\test.txt
echo 第一句话 > .\temp.txt
echo 第二句话 >> .\temp.txt
echo 第三句话 >> .\temp.txt
echo hello;world >> .\temp.txt
echo -------------------------------------------------------------
echo /F参数解析文件内容:
for /f "eol=; tokens=1,3* delims=,- " %%i in (.\test.txt) do (
echo %%i %%j %%k
)
echo -------------------------------------------------------------
echo /F参数解析字符串:
for /f "tokens=1,2,3 delims=,-;" %%i in ("hello,world-window;bat") do (
echo 第一列字符串:%%i;第二列字符串:%%j;第三列字符串:%%k
)
echo -------------------------------------------------------------
echo temp.txt文件内容:
type .\temp.txt
echo -------------------------------------------------------------
echo /F参数解析命令:
rem 结果输出只显示最左侧的“hello”,因为tokens没有设置,所以只显示第一列
for /f "skip=3 delims=; " %%i in ('type .\temp.txt') do (
echo %%i
)
pause
del .\test.txt & del .\temp.txt
三、FOR命令中的变量
%~I - 删除任何引号("),扩展 %I,删除引号规则为:无头不删,有头连尾删
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串
另外,还可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩展到一个驱动器号和路径
%~nxI - 仅将 %I 扩展到一个文件名和扩展名
%~fsI - 仅将 %I 扩展到一个带有短名的完整路径名
%~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩展到类似输出线路的 DIR