文章目录
1 介绍
批处理(Batch),也称为批处理脚本,批处理就是某对象进行批量的处理,通常被认为是一种简化的脚本语言。
批处理脚本应用于DOS和Windows文件中。
哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。
扩展名:bat或cmd
2 基础命令
2.1 echo、@、pause
echo [on|off] [message]
on|off
:指定是否允许命令回显。
message
:指定让MS-DOS在屏幕上显示的正文
@echo off
echo hello
pause
@(命令行回显屏蔽符)
:表示将不在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环境变量
set java_home1

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
set /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
tom#28
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盘,然后恢复
pushd D:\
popd

<p><h3>文章目录</h3><ul><ul><li><a href="#1__2">1 介绍</a></li><li><a href="#2__13">2 基础命令</a></li><ul><li><a href="#21_echopause_15">2.1 echo、@、pause</a></li><li><a href="#22__41">2.2 批处理注释</a></li><li><a href="#23_title__52">2.3 title 标题</a></li><li><a href="#24_color_62">2.4 color</a></li><li><a href="#25_mode_86">2.5 mode</a></li><li><a href="#26__gt__gtgt_98">2.6 重定向符 `>` 和 `>>`</a></li><li><a href="#27__111">2.7 屏蔽批处理错误</a></li><li><a href="#28__118">2.8 接收文件参数</a></li><li><a href="#29_set__146">2.9 set 命令</a></li><li><a href="#291_set__147">2.9.1 set 基础用法</a></li><li><a href="#292_set_a_163">2.9.2 set扩展 /a</a></li><li><a href="#293_set_p_201">2.9.3 set扩展 /p</a></li><li><a href="#210_setlocalendlocal_220">2.10 setlocal/endlocal命令</a></li><li><a href="#211_shift__242">2.11 shift 命令</a></li><li><a href="#212__dp0_270">2.12 获取磁盘路径 %~dp0</a></li></ul><li><a href="#3__290">3 字符串操作</a></li><ul><li><a href="#31__291">3.1 字符换截取操作</a></li><li><a href="#32__331">3.2 字符串替换操作</a></li><li><a href="#33__361">3.3 字符串合并操作</a></li></ul><li><a href="#4_if__378">4 if 语句</a></li><ul><li><a href="#41_if_391">4.1 if</a></li><li><a href="#42_ifelse__403">4.2 if-else: 注意括号旁边的空格</a></li><li><a href="#43_ifelseifelse_415">4.3 if-elseif-else</a></li><li><a href="#44__431">4.4 逻辑符</a></li></ul><li><a href="#5_goto__463">5 goto 语句</a></li><li><a href="#6_for__491">6 for 语句</a></li><ul><li><a href="#61_for_D__535">6.1 for /D 扩展</a></li><li><a href="#62_for_R__551">6.2 for /R 扩展</a></li><li><a href="#63_for_L__586">6.3 for /L 扩展</a></li><li><a href="#63_for_F__623">6.3 for /F 扩展</a></li></ul><li><a href="#7_call__683">7 call 命令</a></li><ul><li><a href="#71__686">7.1 调用外部程序</a></li><li><a href="#72__708">7.2 调用子程序</a></li><li><a href="#73_n_746">7.3 批处理(%n)增强</a></li></ul><li><a href="#8_start__807">8 start 命令</a></li><li><a href="#9_pushd__popd__864">9 pushd 和 popd 命令</a></li></ul></ul></p>
<h2><a id="1__2"></a>1 介绍</h2>
<p>批处理(Batch),也称为批处理脚本,批处理就是某对象进行批量的处理,通常被认为是一种简化的脚本语言。</p>
<p>批处理脚本应用于DOS和Windows文件中。</p>
<p><font face="楷体,华文行楷,隶书,黑体" color="red" size="4"><strong>哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮</strong></font></p>
<p><font face="楷体,华文行楷,隶书,黑体" color="blue" size="4"><strong>有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。</strong></font></p>
<p>扩展名:bat或cmd</p>
<h2><a id="2__13"></a>2 基础命令</h2>
<h3><a id="21_echopause_15"></a>2.1 echo、@、pause</h3>
<p><code>echo [on|off] [message]</code></p>
<p><code>on|off</code>:指定是否允许命令回显。<br />
<code>message</code>:指定让MS-DOS在屏幕上显示的正文</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
echo hello
pause
</code></div></pre>
<p><code>@(命令行回显屏蔽符)</code>:表示将不在DOS中显示 <code>echo off</code>命令<br />
<code>echo off</code>:表示后续命令在DOS中不显示,只显示结果<br />
<code>pause</code>:表示脚本执行完成后,不立即关闭DOS窗口,而是提示“请按任意键继续…”。当用户按了任意键后关闭窗口</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
rem 暂停,用户下键盘继续处理
echo hello &pause > nul
echo 666
pause
echo 777
</code></div></pre>
<h3><a id="22__41"></a>2.2 批处理注释</h3>
<p><code>格式</code>:<code>REM [string]</code><br />
<code>格式</code>:<code>::</code>(两个冒号)</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
rem 这是第一个注释
:: 这是第二个注释
echo hello
pause
</code></div></pre>
<h3><a id="23_title__52"></a>2.3 title 标题</h3>
<pre><div class="hljs"><code class="lang-shell">@echo off
title 有勇气的牛排
echo 666
pause
</code></div></pre>
<p><img src="https://img-blog.csdnimg.cn/c07b4551b2bf41a1bf6f27b99e8c9713.png" alt="在这里插入图片描述" /></p>
<h3><a id="24_color_62"></a>2.4 color</h3>
<p>帮助:<code>color help</code></p>
<pre><div class="hljs"><code class="lang-shell">字体颜色 背景色
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">@echo off
title courageSteak
rem 颜色设置
color f2
echo 666
pause
</code></div></pre>
<h3><a id="25_mode_86"></a>2.5 mode</h3>
<p>配置设备</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
title courageSteak
rem 这里设置命令行窗口大小
mode con cols=113 lines=15 & color 9f
color f2
echo 666
pause
</code></div></pre>
<h3><a id="26__gt__gtgt_98"></a>2.6 重定向符 <code>></code> 和 <code>>></code></h3>
<p><code>重定向符</code>:用于将某条命令的输出写到指定的地方,如写入到文件、nul(空设备)。</p>
<p><code>></code>:会覆盖文件中已有的内容。<br />
<code>>></code>:与 <code>></code> 不同的是,<code>>></code> 会将结果直接追加到指定文件的后面。</p>
<p>需求:将ping命令的输出信息写到ping.txt文件</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
ping www.baidu.com > ping.txt
echo finished
pause
</code></div></pre>
<h3><a id="27__111"></a>2.7 屏蔽批处理错误</h3>
<p><code>errorlevel</code><br />
需求:加入使用copy拷贝文件到指定目录</p>
<pre><div class="hljs"><code class="lang-shell">在这里插入代码片
</code></div></pre>
<h3><a id="28__118"></a>2.8 接收文件参数</h3>
<p>单个参数</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
echo param0=%0
echo param1=%1
echo param2=%2
echo param3=%3
echo param4=%4
echo param5=%5
pause
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/b2aa274f372e6e663764b1b407f86ada.png" alt="image.png" /></p>
<p>使用shift命令接收多个参数</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
echo %1 %2 %3
shift /0
echo %1 %2 %3
shift /0
echo %1 %2 %3
pause
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/62da738f9c2a1dd8bab503eeaa0d58b8.png" alt="image.png" /></p>
<h3><a id="29_set__146"></a>2.9 set 命令</h3>
<h3><a id="291_set__147"></a>2.9.1 set 基础用法</h3>
<p><code>描述</code>:用来显示、设置或删除 cmd 环境变量。</p>
<p><code>语法</code>:<code>set [variable=[string]]</code></p>
<ul>
<li>variable:指定环境变量名</li>
<li>string:指定变量值</li>
</ul>
<p>实例:显示当前java环境变量</p>
<pre><div class="hljs"><code class="lang-shell">set java_home1
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/3b99898664ee8ec0bfe484274a02738d.png" alt="image.png" /></p>
<h3><a id="292_set_a_163"></a>2.9.2 set扩展 /a</h3>
<p>如果使用<code>任何逻辑</code>或<code>取余</code>操作符,则需要将表达式字符串用<code>引号括起来</code></p>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<p>如果一个变量没有被定义,其值默认为0</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
set /a val=tmp+2
echo %val%
rem 输出:2
pause
</code></div></pre>
<h3><a id="293_set_p_201"></a>2.9.3 set扩展 /p</h3>
<p><code>描述</code>:用户输入</p>
<p><code>语法</code>:<code>set /P variateName=promptStrig</code></p>
<ul>
<li>variateName 为变量名</li>
<li>promptStrig 为提示字符串,将在 DOS 窗口中显示</li>
</ul>
<p><mark>实例:提示用户输入命令(此处win10测试未通过)</mark></p>
<pre><div class="hljs"><code class="lang-shell">@echo off
set /p username=username:
echo username:%username%
pause
</code></div></pre>
<h3><a id="210_setlocalendlocal_220"></a>2.10 setlocal/endlocal命令</h3>
<p><code>定义</code>:用来定义个一个局部区域,这个局部区域中的环境变量任何变化都不会改变原先的环境变量。</p>
<p>实例:局部区域修改path</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
echo 重置前
set path
setlocal
echo 重置path
set path=E:\tools
set path
endlocal
echo 重置path后
set path
pause
</code></div></pre>
<h3><a id="211_shift__242"></a>2.11 shift 命令</h3>
<p><code>定义</code>:该命令用于更改普处理文件处理参数的方式,如指定处理参数的位置等。</p>
<p><code>帮助</code>:<code>shift /?</code></p>
<p>实例1:利用shift命令动态输出批处理执行时所输入的所有参数。</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
:round
if "%1"=="" goto cmd1
echo 参数:%1
shift
goto round
:cmd1
echo 没有获取到参数,结束脚本
goto end
:end
pause
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/efa8b48a62b46159aada527521e6c727.png" alt="image.png" /></p>
<h3><a id="212__dp0_270"></a>2.12 获取磁盘路径 %~dp0</h3>
<p>1、%cd%</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
rem 获取当前脚本所在路径
set basePath=%cd%
echo %basePath%
pause
</code></div></pre>
<p>2、%~dp0</p>
<p>该命令可以用来获取批处理文件的实际路径,与当前DOS环境所在的目录没有关系<br />
<code>d</code>:为 Drive 的缩写,即为驱动器,磁盘;<br />
<code>p</code>:为 Path 缩写,即为路径,目录;</p>
<p>不推荐使用 <code>cd</code> 命令,转到 <code>%~dp0</code>返回的目录<br />
推荐使用: <code>cd /d %~dp0</code></p>
<h2><a id="3__290"></a>3 字符串操作</h2>
<h3><a id="31__291"></a>3.1 字符换截取操作</h3>
<p><code>语法</code>:<code>%variable:~n,m%</code></p>
<p>实例1:截取字符串</p>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<h3><a id="32__331"></a>3.2 字符串替换操作</h3>
<p>实例1:你真棒,替换为:你特别棒</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
set str=你真棒
echo 替换前:%str%
echo 替换后:%str:真=特别%
pause
</code></div></pre>
<p>实例2:利用字符串替换功能,实现查找字符串是否包含指定字符</p>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<h3><a id="33__361"></a>3.3 字符串合并操作</h3>
<p>将两个字符串合并到一起</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
set str1=Hello
set str2=World
rem 直接输出合并后的字符串
echo %str1%%str2%
rem 将合并后的字符串放入 str 变量中
set str=%str1%%str2%
echo %str%
pause
</code></div></pre>
<h2><a id="4_if__378"></a>4 if 语句</h2>
<p>if 语句是执行批处理程序的条件语句。语法为:</p>
<pre><div class="hljs"><code class="lang-shell">if [not] errorlevel num command
if [not] str1==str2 command
if [not] exist filename command
not:取反
errorlevel number:如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。
string==string2:判断字符是否相等
exist filename:判断文件是否存在
</code></div></pre>
<h3><a id="41_if_391"></a>4.1 if</h3>
<pre><div class="hljs"><code class="lang-shell">@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% 文件不存在
</code></div></pre>
<h3><a id="42_ifelse__403"></a>4.2 if-else: 注意括号旁边的空格</h3>
<pre><div class="hljs"><code class="lang-shell">@echo off
set /p pwd=请输入密码:
if "%pwd%"=="123" (
echo 密码正确
) else (
echo 密码错误:%pwd%
)
</code></div></pre>
<h3><a id="43_ifelseifelse_415"></a>4.3 if-elseif-else</h3>
<pre><div class="hljs"><code class="lang-shell">@echo off
set /p score=请输入成绩:
if %score% lss 60 (
echo 未及格
) else if %score% lss 70 (
echo 及格
) else (
echo 优秀
)
</code></div></pre>
<h3><a id="44__431"></a>4.4 逻辑符</h3>
<ul>
<li>EQU - 等于</li>
<li>NEQ - 不等于</li>
<li>LSS - 小于</li>
<li>LEQ - 小于或等于</li>
<li>GTR - 大于</li>
<li>GEQ - 大于或等于</li>
</ul>
<p><code>/I</code>:表示不区分大小写</p>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<p><code>DEFINED</code>:与exist一样,还能取环境变量</p>
<pre><div class="hljs"><code class="lang-shell">@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 环境变量
</code></div></pre>
<h2><a id="5_goto__463"></a>5 goto 语句</h2>
<p>实例:要求用户输入字母(A或B),然后根据用户输入的字母显示不同提示信息</p>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<ul>
<li>代码退出也可以用:<code>exit</code></li>
<li>名字不可以使用变量</li>
<li>如果有同名标签,则执行第一个</li>
</ul>
<h2><a id="6_for__491"></a>6 for 语句</h2>
<p>实例1:执行简单的for循环</p>
<pre><div class="hljs"><code class="lang-shell">for %I in (ABC) do echo %I
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/f67f7279247e773626ab04d9c4a97ce1.png" alt="image.png" /></p>
<pre><div class="hljs"><code class="lang-shell">@echo off
rem 输出指定的字符串
for %%I in (ABC) do (
echo %%I
)
for %%I in (ABC) do echo %%I
</code></div></pre>
<p>实例2:使用空格、分号、等号 分割</p>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/fed8236ccdf7162f3a3166a439df0329.png" alt="image.png" /></p>
<p>实例3:打印批处理当前目录下所有文件名称、后缀为txt的文件的名称</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
rem 打印当前目录下面所有的文件名称
for %%i in (*.*) do echo "%%i"
rem 打印当前目录下面所有后缀为 txt 的文件名称
for %%i in (*.txt) do echo "%%i"
</code></div></pre>
<h3><a id="61_for_D__535"></a>6.1 for /D 扩展</h3>
<p>for 语句默认匹配文件名。<br />
<code>/D</code>:与目录名匹配</p>
<pre><div class="hljs"><code class="lang-shell">@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"
</code></div></pre>
<h3><a id="62_for_R__551"></a>6.2 for /R 扩展</h3>
<p><code>/R</code>:递归进入目录,没有指定,则默认为当前目录树</p>
<p>实例1:搜索</p>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<p>实例2:搜索C盘是否有 notepad.exe可执行文件,如果存在则启动</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
for /r c:/ %%i in (notepad.exe) do (
if exist %%i (
echo 找到了 notepad.exe
rem 启动
start %%i
goto end
)
)
echo 没有找到
:end
</code></div></pre>
<h3><a id="63_for_L__586"></a>6.3 for /L 扩展</h3>
<p><code>/L</code>:表示以增量形式从start以每次增加 step,知道end的一个数字序列,如果start<end,就会执行该命令,反之,停止。</p>
<p>实例:遍历1-5,步长为2</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
for /L %%i in (1,2,5) do echo %%i
pause
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/bac2db6dadb3fe35275cfe7312fa5dd9.png" alt="image.png" /></p>
<p>实例2:创建5~的序列</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
for /L %%i in (5,-2,1) do echo %%i
pause
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/8354a501f56ca6a3c828f9f291883efa.png" alt="image.png" /></p>
<p>实例2:创建指定数量文件夹</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
for /L %%i in (1,1,5) do (
md 文件%%i
)
pause
</code></div></pre>
<h3><a id="63_for_F__623"></a>6.3 for /F 扩展</h3>
<p><code>/F</code>:主要用来处理文件和一些命令的输出结果,还可以提取文本文件的内容。</p>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta">name#</span><span class="language-bash">age<span class="hljs-comment">#score</span></span>
<span class="hljs-meta">tom#</span><span class="language-bash">28<span class="hljs-comment">#95</span></span>
charles,32#99
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">userinfo</span>
name age score
tom 28 95
charles 32 99
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<p><strong>tokens=x,y,m-n</strong></p>
<p><code>tokens=m</code>:表示提取第m列<br />
<code>tokens=m,n</code>:表示提取m列和n列<br />
<code>tokens=m-n</code>:表示提取m~n列<br />
<code>tokens=*</code>:忽略行首的所有空格<br />
<code>tokens=m*</code>:提取第m列以后的所有字符</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
for /F "delims=#|, tokens=3" %%i in (test.txt) do (
echo %%i
)
pause
</code></div></pre>
<h2><a id="7_call__683"></a>7 call 命令</h2>
<p>call命令不但可以在普处理中调用另一个批处理程序,而且还可以调用指定标号后面的所有命令(也可以称为子程序)</p>
<h3><a id="71__686"></a>7.1 调用外部程序</h3>
<p>实例:创建2个批处理文件,分别为test.bat和sub.bat。在test.bat中调用sub.bat,不传递任何参数。</p>
<p>test.bat</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
echo test.bat
call sub.bat a b
call C:\Users\admin\Desktop\批处理\sub.bat c d
pause
</code></div></pre>
<p>sub.bat</p>
<pre><div class="hljs"><code class="lang-shell">echo off
echo sub.bat
echo 第一个参数:%1
echo 第二个参数:%2
</code></div></pre>
<h3><a id="72__708"></a>7.2 调用子程序</h3>
<p>语法:<code>call :label [arguments]</code></p>
<ul>
<li><code>label</code>:用于指定调用的位置标签,类似goto</li>
<li><code>arguments</code>:对于以:label开头的批处理程序(或子程序),指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理参数或者变量;</li>
</ul>
<p>实例:call sub标签</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
call :sub
goto end
:sub
echo sub label
:end
pause
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">@echo off
call :sub 10
goto end
rem 子程序
:sub
echo arg0=%0 arg1=%1
goto :eof
:end
pause
</code></div></pre>
<ul>
<li>子程序一般放在最后,并且在主程序最后加上exit或者跳转语句,避免错误进入子程序。</li>
<li>子程序、主程序,变量均为全局变量</li>
</ul>
<h3><a id="73_n_746"></a>7.3 批处理(%n)增强</h3>
<ul>
<li>%~1 删除引号("),扩展 %1</li>
<li>%~f1 将 %1 扩展到一个完全合格的路径名</li>
<li>%~d1 仅将 %1 扩展到一个驱动器号</li>
<li>%~p1 仅将 %1 扩展到一个路径</li>
<li>%~n1 仅将 %1 扩展到一个文件名</li>
<li>%~x1 仅将 %1 扩展到一个文件扩展名</li>
<li>%~s1 扩展的路径只含有短名</li>
<li>%~a1 将 %1 扩展到文件属性</li>
<li>%~t1 将 %1 扩展到文件的日期/时间</li>
<li>%~z1 将 %1 扩展到文件的大小</li>
<li>%~$PATH:1 查找列在 PATH 环境变量的目录,并将 %1 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此修改符会扩展到空字符串</li>
</ul>
<p>可以将增强符组合起来,可取得多重结果:</p>
<ul>
<li>%~dp1 只将 %1 扩展到驱动器号和路径</li>
<li>%~nx1 只将 %1 扩展到文件名和扩展名</li>
<li>%~dp$PATH:1 在列在 PATH 环境变量中的目录里查找 %1,并扩展到找到的第一个文件的驱动器号和路径。</li>
<li>%~ftza1 将 %1 扩展到类似 DIR 的输出行。</li>
</ul>
<p>实例:生成一个临时文件 tmp.txt,先将将目录 C:\windows设置为当前目录,调用子程序进行参数扩展;然后再恢复当前目录,调用子程序;观察参数扩展结果。</p>
<pre><div class="hljs"><code class="lang-shell">@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
</code></div></pre>
<h2><a id="8_start__807"></a>8 start 命令</h2>
<p>帮助:<code>start /?</code></p>
<pre><div class="hljs"><code class="lang-shell">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 的原始环境,而不是当前环境。
</code></div></pre>
<p>可以写绝对路径</p>
<p>实例:启动 notepad.exe 记事本程序</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
start notepad.exe
</code></div></pre>
<p>实例:启动一个子脚本,并设置titile为“测试”</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
start "测试" sub.bat
</code></div></pre>
<p>实例:最小化/最大化 启动记事本</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
rem 最小化启动
start /min notepad.exe
rem 最大化启动
start /max notepad.exe
</code></div></pre>
<p>实例:检测 打开的记事本 是否关闭</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
start /wait notepad.exe
echo 记事本被关闭
</code></div></pre>
<p>实例:打开指定网址</p>
<pre><div class="hljs"><code class="lang-shell">@echo off
start www.couragesteak.com
</code></div></pre>
<h2><a id="9_pushd__popd__864"></a>9 pushd 和 popd 命令</h2>
<p>定义:一般用于保存当前路径,并且切换到指定的新路径</p>
<p>语法:<code>pushd [path | ..]</code></p>
<p>path:指定要切换的路径</p>
<p>实例:通过dos窗口切换到D盘,然后恢复</p>
<pre><div class="hljs"><code class="lang-shell">pushd D:\
popd
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/01f9c59314192804ba1216f9430ec3be.png" alt="image.png" /></p>
留言