windows bat 批处理常用命令

时间:2021-12-10 00:56:13


文章目录

  • ​​1 介绍​​
  • ​​2 基础命令​​
  • ​​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 字符串操作​​
  • ​​3.1 字符换截取操作​​
  • ​​3.2 字符串替换操作​​
  • ​​3.3 字符串合并操作​​
  • ​​4 if 语句​​
  • ​​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 call 命令​​
  • ​​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在屏幕上显示的正文

@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

windows bat 批处理常用命令

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

windows bat 批处理常用命令


使用shift命令接收多个参数

@echo off
echo %1 %2 %3
shift /0
echo %1 %2 %3
shift /0
echo %1 %2 %3
pause

windows bat 批处理常用命令

2.9 set 命令

2.9.1 set 基础用法

​描述​​:用来显示、设置或删除 cmd 环境变量。

​语法​​​:​​set [variable=[string]]​

  • variable:指定环境变量名
  • string:指定变量值

实例:显示当前java环境变量

set java_home1

windows bat 批处理常用命令

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

windows bat 批处理常用命令

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

windows bat 批处理常用命令

@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

windows bat 批处理常用命令


实例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

windows bat 批处理常用命令


实例2:创建5~的序列

@echo off

for /L %%i in (5,-2,1) do echo %%i

pause

windows bat 批处理常用命令


实例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盘,然后恢复

pushd D:\
popd

windows bat 批处理常用命令