文章目录
- 2.1 echo、@、pause
- 2.2 批处理注释
- 2.3 title 标题
- 2.4 color
- 2.5 mode
- 2.6 重定向符 `>` 和 `>>`
- 2.7 屏蔽批处理错误
- 2.8 接收文件参数
- 2.9 set 命令
- 2.9.1 set 基础用法
- 2.9.2 set扩展 /a
- 2.9.3 set扩展 /p
- 2.10 setlocal/endlocal命令
- 2.11 shift 命令
- 2.12 获取磁盘路径 %~dp0
- 3.1 字符换截取操作
- 3.2 字符串替换操作
- 3.3 字符串合并操作
- 4.1 if
- 4.2 if-else: 注意括号旁边的空格
- 4.3 if-elseif-else
- 4.4 逻辑符
- 5 goto 语句
- 6 for 语句
- 6.1 for /D 扩展
- 6.2 for /R 扩展
- 6.3 for /L 扩展
- 6.3 for /F 扩展
- 7.1 调用外部程序
- 7.2 调用子程序
- 7.3 批处理(%n)增强
- 8 start 命令
- 9 pushd 和 popd 命令
1 介绍
批处理(Batch),也称为批处理脚本,批处理就是某对象进行批量的处理,通常被认为是一种简化的脚本语言。
批处理脚本应用于DOS和Windows文件中。
扩展名:bat或cmd
2 基础命令
2.1 echo、@、pause
echo [on|off] [message]
on|off
:指定是否允许命令回显。
message
:指定让MS-DOS在屏幕上显示的正文
@(命令行回显屏蔽符)
:表示将不在DOS中显示 echo off
命令
echo off
:表示后续命令在DOS中不显示,只显示结果
pause
:表示脚本执行完成后,不立即关闭DOS窗口,而是提示“请按任意键继续…”。当用户按了任意键后关闭窗口
@echo off
rem 暂停,用户下键盘继续处理
echo hello &pause > nul
echo 666
pause
echo 777
2.2 批处理注释
格式
:REM [string]
格式
:::
(两个冒号)
@echo off
rem 这是第一个注释
:: 这是第二个注释
echo hello
pause
2.3 title 标题
@echo off
title 有勇气的牛排
echo 666
pause
2.4 color
帮助:color help
字体颜色 背景色
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
@echo off
title courageSteak
rem 颜色设置
color f2
echo 666
pause
2.5 mode
配置设备
@echo off
title courageSteak
rem 这里设置命令行窗口大小
mode con cols=113 lines=15 & color 9f
color f2
echo 666
pause
2.6 重定向符 >
和 >>
重定向符
:用于将某条命令的输出写到指定的地方,如写入到文件、nul(空设备)。
>
:会覆盖文件中已有的内容。
>>
:与 >
不同的是,>>
会将结果直接追加到指定文件的后面。
需求:将ping命令的输出信息写到ping.txt文件
@echo off
ping www.baidu.com > ping.txt
echo finished
pause
2.7 屏蔽批处理错误
errorlevel
需求:加入使用copy拷贝文件到指定目录
2.8 接收文件参数
单个参数
@echo off
echo param0=%0
echo param1=%1
echo param2=%2
echo param3=%3
echo param4=%4
echo param5=%5
pause
使用shift命令接收多个参数
@echo off
echo %1 %2 %3
shift /0
echo %1 %2 %3
shift /0
echo %1 %2 %3
pause
2.9 set 命令
2.9.1 set 基础用法
描述
:用来显示、设置或删除 cmd 环境变量。
语法
:set [variable=[string]]
- variable:指定环境变量名
- string:指定变量值
实例:显示当前java环境变量
2.9.2 set扩展 /a
如果使用任何逻辑
或取余
操作符,则需要将表达式字符串用引号括起来
@echo off
rem 使用 /a 执行加法运算。
set /a val=10+22
echo %val%
rem 变量val+10=42
set /a val2=%val%+10
echo %val2%
rem 将16使用位移操作符,向右移动一位 等同于 除以2,val3=16/2=8
set /a "val3=16>>1"
echo %val3%
rem 使用分组符号提升加法的优先级 1+2+3)*3=6*3=18
set /a val4=(1+2+3)*3
echo %val4%
rem 使用 %% 进行取余运算
set /a "val5=5%%2"
echo %val5%
pause
如果一个变量没有被定义,其值默认为0
@echo off
set /a val=tmp+2
echo %val%
rem 输出:2
pause
2.9.3 set扩展 /p
描述
:用户输入
语法
:set /P variateName=promptStrig
- variateName 为变量名
- promptStrig 为提示字符串,将在 DOS 窗口中显示
实例:提示用户输入命令(此处win10测试未通过)
@echo off
echo /p username=username:
echo username:%username%
pause
2.10 setlocal/endlocal命令
定义
:用来定义个一个局部区域,这个局部区域中的环境变量任何变化都不会改变原先的环境变量。
实例:局部区域修改path
@echo off
echo 重置前
set path
setlocal
echo 重置path
set path=E:\tools
set path
endlocal
echo 重置path后
set path
pause
2.11 shift 命令
定义
:该命令用于更改普处理文件处理参数的方式,如指定处理参数的位置等。
帮助
:shift /?
实例1:利用shift命令动态输出批处理执行时所输入的所有参数。
@echo off
:round
if "%1"=="" goto cmd1
echo 参数:%1
shift
goto round
:cmd1
echo 没有获取到参数,结束脚本
goto end
:end
pause
2.12 获取磁盘路径 %~dp0
1、%cd%
@echo off
rem 获取当前脚本所在路径
set basePath=%cd%
echo %basePath%
pause
2、%~dp0
该命令可以用来获取批处理文件的实际路径,与当前DOS环境所在的目录没有关系
d
:为 Drive 的缩写,即为驱动器,磁盘;
p
:为 Path 缩写,即为路径,目录;
不推荐使用 cd
命令,转到 %~dp0
返回的目录
推荐使用: cd /d %~dp0
3 字符串操作
3.1 字符换截取操作
语法
:%variable:~n,m%
实例1:截取字符串
@echo off
set str=abcdefghijklmnopqrstuvwxyz0123456789
echo 原字符串
echo %str%
rem abcde
echo 截取前5个字符
echo %str:~0,5%
rem fghijklmnopqrstuvwxyz0123456789
echo 截取第6个字符直到最后一个
echo %str:~5%
rem 56789
echo 截取最后5个字符
echo %str:~-5%
echo %str:~-5,5%
rem abcdefghijklmnopqrstuvwxyz01234
echo 截取第1个到倒数第6个字符
echo %str:~0,-5%
rem defgh
echo 从第4个字符开始,截取5个字符
echo %str:~3,5%
rem 34567
echo 从倒数第7个字符开始,截取5个字符
echo %str:~-7,5%
pause
3.2 字符串替换操作
实例1:你真棒,替换为:你特别棒
@echo off
set str=你真棒
echo 替换前:%str%
echo 替换后:%str:真=特别%
pause
实例2:利用字符串替换功能,实现查找字符串是否包含指定字符
@echo off
set str=hello,whlcome to Earth.
echo 原文:%str%
rem 判断str变量中是否存在 the 字符串
set "tmpStr=%str:the%"
echo %tmpStr%
if "%str%"=="%tmpStr%" (
echo 很抱歉!没有找到
) else (
echo 存在字符串 “the”
)
pause
3.3 字符串合并操作
将两个字符串合并到一起
@echo off
set str1=Hello
set str2=World
rem 直接输出合并后的字符串
echo %str1%%str2%
rem 将合并后的字符串放入 str 变量中
set str=%str1%%str2%
echo %str%
pause
4 if 语句
if 语句是执行批处理程序的条件语句。语法为:
if [not] errorlevel num command
if [not] str1==str2 command
if [not] exist filename command
not:取反
errorlevel number:如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。
string==string2:判断字符是否相等
exist filename:判断文件是否存在
4.1 if
@echo off
set /p pwd=请输入密码:
if "%pwd%"=="123456" echo 密码正确
if not "%pwd%"=="123456" echo 密码错误:%pwd%
set file=C:\Users\admin\Desktop\批处理\test1.bat
if exist %file% echo %file% 文件存在
if not exist %file% echo %file% 文件不存在
4.2 if-else: 注意括号旁边的空格
@echo off
set /p pwd=请输入密码:
if "%pwd%"=="123" (
echo 密码正确
) else (
echo 密码错误:%pwd%
)
4.3 if-elseif-else
@echo off
set /p score=请输入成绩:
if %score% lss 60 (
echo 未及格
) else if %score% lss 70 (
echo 及格
) else (
echo 优秀
)
4.4 逻辑符
- EQU - 等于
- NEQ - 不等于
- LSS - 小于
- LEQ - 小于或等于
- GTR - 大于
- GEQ - 大于或等于
/I
:表示不区分大小写
@echo off
if "A" equ "A" echo A equ A
if "A" == "A" echo A==A
if /I "A" equ "a" echo A equ a
if 100 equ 100 echo 100 equ 100
if 100 == 100 echo 100==100
DEFINED
:与exist一样,还能取环境变量
@echo off
set val=10
if defined val echo val=%val%
if not defined val echo 没有定义 val 环境变量
if defined myPath echo val=%myPath%
if not defined myPath echo 没有定义 myPath 环境变量
5 goto 语句
实例:要求用户输入字母(A或B),然后根据用户输入的字母显示不同提示信息
@echo off
setlocal
set /p input=请输入字母A或B:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
echo 您没有输入字母
goto endlocal
:A
echo 您输入的字母是A
goto end
:B
echo 您输入的字母是B
goto end
:end
- 代码退出也可以用:
exit
- 名字不可以使用变量
- 如果有同名标签,则执行第一个
6 for 语句
实例1:执行简单的for循环
for %I in (ABC) do echo %I
@echo off
rem 输出指定的字符串
for %%I in (ABC) do (
echo %%I
)
for %%I in (ABC) do echo %%I
实例2:使用空格、分号、等号 分割
@echo off
for %%I in (A B C) do echo %%I
for %%I in (A;B;C) do echo %%I
for %%I in (A,B,C) do echo %%I
for %%I in (A=B=C) do echo %%I
实例3:打印批处理当前目录下所有文件名称、后缀为txt的文件的名称
@echo off
rem 打印当前目录下面所有的文件名称
for %%i in (*.*) do echo "%%i"
rem 打印当前目录下面所有后缀为 txt 的文件名称
for %%i in (*.txt) do echo "%%i"
6.1 for /D 扩展
for 语句默认匹配文件名。
/D
:与目录名匹配
@echo off
echo 匹配当前目录下面的 文件名
for %%i in (*) do echo "%%i"
echo /D 匹配当前目录下面的 所有目录,不包含子目录
for /D %%i in (*) do echo "%%i"
echo 搜索C盘下所有目录,不包括子目录
for /D %%i in (C:/*) do echo "%%i"
6.2 for /R 扩展
/R
:递归进入目录,没有指定,则默认为当前目录树
实例1:搜索
@echo off
echo 搜索当前目录下的所有文件
for /r %%i in (*) do echo %%i
rem echo 输出D盘下所有目录
rem for /r d:/ %%i in (.) do echo %%i
echo 搜索C盘里所有扩展名为exe的文件
for /r c:/ %%i in (*.exe) do echo %%i
pause
实例2:搜索C盘是否有 notepad.exe可执行文件,如果存在则启动
@echo off
for /r c:/ %%i in (notepad.exe) do (
if exist %%i (
echo 找到了 notepad.exe
rem 启动
start %%i
goto end
)
)
echo 没有找到
:end
6.3 for /L 扩展
/L
:表示以增量形式从start以每次增加 step,知道end的一个数字序列,如果start<end,就会执行该命令,反之,停止。
实例:遍历1-5,步长为2
@echo off
for /L %%i in (1,2,5) do echo %%i
pause
实例2:创建5~的序列
@echo off
for /L %%i in (5,-2,1) do echo %%i
pause
实例2:创建指定数量文件夹
@echo off
for /L %%i in (1,1,5) do (
md 文件%%i
)
pause
6.3 for /F 扩展
/F
:主要用来处理文件和一些命令的输出结果,还可以提取文本文件的内容。
name#age#score
tom#28#95
charles,32#99
# userinfo
name age score
tom 28 95
charles 32 99
@echo off
echo 普通提取名字
for /F %%i in (test.txt) do (
echo %%i
)
echo eol=c 省略指定字符开头的行
for /F "eol=#" %%i in (test.txt) do (
echo %%i
)
echo skip=n 从文件头跳过的行数
for /F "skip=2" %%i in (test.txt) do (
echo %%i
)
echo delims=# 使用#或,分割内容,如有空格放到最后
for /F "delims=#|,| " %%i in (test.txt) do (
echo %%i
)
pause
tokens=x,y,m-n
tokens=m
:表示提取第m列
tokens=m,n
:表示提取m列和n列
tokens=m-n
:表示提取m~n列
tokens=*
:忽略行首的所有空格
tokens=m*
:提取第m列以后的所有字符
@echo off
for /F "delims=#|, tokens=3" %%i in (test.txt) do (
echo %%i
)
pause
7 call 命令
call命令不但可以在普处理中调用另一个批处理程序,而且还可以调用指定标号后面的所有命令(也可以称为子程序)
7.1 调用外部程序
实例:创建2个批处理文件,分别为test.bat和sub.bat。在test.bat中调用sub.bat,不传递任何参数。
test.bat
@echo off
echo test.bat
call sub.bat a b
call C:\Users\admin\Desktop\批处理\sub.bat c d
pause
sub.bat
echo off
echo sub.bat
echo 第一个参数:%1
echo 第二个参数:%2
7.2 调用子程序
语法:call :label [arguments]
-
label
:用于指定调用的位置标签,类似goto
-
arguments
:对于以:label开头的批处理程序(或子程序),指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理参数或者变量;
实例:call sub标签
@echo off
call :sub
goto end
:sub
echo sub label
:end
pause
@echo off
call :sub 10
goto end
rem 子程序
:sub
echo arg0=%0 arg1=%1
goto :eof
:end
pause
- 子程序一般放在最后,并且在主程序最后加上exit或者跳转语句,避免错误进入子程序。
- 子程序、主程序,变量均为全局变量
7.3 批处理(%n)增强
- %~1 删除引号("),扩展 %1
- %~f1 将 %1 扩展到一个完全合格的路径名
- %~d1 仅将 %1 扩展到一个驱动器号
- %~p1 仅将 %1 扩展到一个路径
- %~n1 仅将 %1 扩展到一个文件名
- %~x1 仅将 %1 扩展到一个文件扩展名
- %~s1 扩展的路径只含有短名
- %~a1 将 %1 扩展到文件属性
- %~t1 将 %1 扩展到文件的日期/时间
- %~z1 将 %1 扩展到文件的大小
- %~$PATH:1 查找列在 PATH 环境变量的目录,并将 %1 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此修改符会扩展到空字符串
可以将增强符组合起来,可取得多重结果:
- %~dp1 只将 %1 扩展到驱动器号和路径
- %~nx1 只将 %1 扩展到文件名和扩展名
- %~dp$PATH:1 在列在 PATH 环境变量中的目录里查找 %1,并扩展到找到的第一个文件的驱动器号和路径。
- %~ftza1 将 %1 扩展到类似 DIR 的输出行。
实例:生成一个临时文件 tmp.txt,先将将目录 C:\windows设置为当前目录,调用子程序进行参数扩展;然后再恢复当前目录,调用子程序;观察参数扩展结果。
@echo off
echo 创建一个临时文件 > tmp.txt
rem 先保存当前目录,再将 c:\windows 设为当前目录
pushd c:\windows
call :sub tmp.txt
rem 回复前次的当前目录
popd
call :sub tmp.txt
pause
del tmp.txt
goto :end
:sub
echo 删除引号:%~1
echo 路径+文件:%~f1
echo 驱动器号:%~d1
echo 仅路径:%~p1
echo 文件名:%~n1
echo 文件扩展名:%~x1
echo 短名(与f感觉相同):%~s1
echo 文件属性(异常):%~a1
echo 文件的日期/时间:%~t1
echo 文件的大小:%~z1
echo 驱动器号和路径:%~dp1
echo 文件名和扩展名:%~nx1
echo 类似 DIR 的输出行:%~ftza1
goto :end
rem goto :eof
:end
pause
8 start 命令
帮助:start /?
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
[command/program] [parameters]
"title" 在窗口标题栏中显示的标题。
path 启动目录。
B 启动应用程序,但不创建新窗口。
应用程序已忽略 ^C 处理。除非应用程序
启用 ^C 处理,否则 ^Break 是唯一可以中断
该应用程序的方式。
I 新的环境将是传递
给 cmd.exe 的原始环境,而不是当前环境。
可以写绝对路径
实例:启动 notepad.exe 记事本程序
@echo off
start notepad.exe
实例:启动一个子脚本,并设置titile为“测试”
@echo off
start "测试" sub.bat
实例:最小化/最大化 启动记事本
@echo off
rem 最小化启动
start /min notepad.exe
rem 最大化启动
start /max notepad.exe
实例:检测 打开的记事本 是否关闭
@echo off
start /wait notepad.exe
echo 记事本被关闭
实例:打开指定网址
@echo off
start www.couragesteak.com
9 pushd 和 popd 命令
定义:一般用于保存当前路径,并且切换到指定的新路径
语法:pushd [path | ..]
path:指定要切换的路径
实例:通过dos窗口切换到D盘,然后恢复