批处理脚本(bat脚本)用法总结

  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于 DOS 和 Windows 系统中。批处理文件的扩展名为 bat(或 cmd)。通常我们指定的批处理指 DOS批处理脚本。
  • DOS 批处理则是基于 DOS 命令的,用来自动地批量地执行 DOS 命令以实现特定操作的脚本。更复杂的情况,需要使用if、for、goto等命令控制程式的运行过程,如同 C、Python 等高级语言一样。如果需要实现更复杂的应用,利用外部程式是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。

一、常用命令

常用命令也可见文章:链接

1.文件夹管理

  • cd 显示当前目录名或改变当前目录。
  • md 创建目录。
  • rd 删除一个目录。
  • dir 显示目录中的文件和子目录列表。
  • tree 以图形显示驱动器或路径的文件夹结构。
  • path 为可执行文件显示或设置一个搜索路径。
  • xcopy 复制文件和目录树。

2. 文件管理

  • type 显示文本文件的内容。
  • copy 将一份或多份文件复制到另一个位置。
  • del 删除一个或数个文件。
  • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
  • ren 重命名文件。
  • replace 替换文件。
  • attrib 显示或更改文件属性。
  • find 搜索字符串。
  • fc 比较两个文件或两个文件集并显示它们之间的不同

3. 网络命令

  • ping 进行网络连接测试、名称解析
  • ftp 文件传输
  • net 网络命令集及用户管理
  • telnet 远程登陆
  • ipconfig显示、修改TCP/IP设置
  • msg 给用户发送消息
  • arp 显示、修改局域网的IP地址-物理地址映射列表

4. 系统管理

  • at 安排在特定日期和时间运行命令和程序
  • shutdown立即或定时关机或重启
  • tskill 结束进程
  • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
  • tasklist显示进程列表(Windows XP Home Edition中没有)
  • sc 系统服务设置与控制
  • reg 注册表控制台工具
  • powercfg控制系统上的电源设置

二、基本语法

1. 注释

在bat脚本中,我们使用 ::REM 添加注释,用法如下:

:: 打印“你好,世界!”
echo 你好,世界!

注意

  • :: 只能出现在每一行的开头,其后的内容被当作注释
  • REM 可用于任何位置,其后的内容被当作是注释

2. 变量

变量类型包括:数字、字符串及数组。

:: 定义数字变量
set /a n=0
:: 定义字符串变量
set s1=hellworld
set s2="Hello World"
set "s3=Hello, World!"
:: 定义数组变量
set arr = 1 2 3 4 5 6
@echo off 
set list=1 2 3 4 
(for %%a in (%arr%) do ( 
   echo %%a 
))
@echo off
:: 提示用户输入他们的名字
set /p username=请输入您的名字: 

:: 显示输入的名字
echo 您好,%username%!

:: 提示用户输入一个数字
set /p number=请输入一个数字: 

:: 显示输入的数字并计算它的平方
set /a square=%number% * %number%
echo 您输入的数字是 %number%,它的平方是 %square%。

pause

注意:

  • 变量名与内容之间通过=连接且没有空格

3. 判断

在bat脚本中,if条件判断语句共有6种比较操作符,分别为

操作符描述全称
equ等于equal
neq不等于no equal
lss小于less than
leq小于等于leq less than or equal
gtr大于greater than
geq大于等于geq greater than or equal

注意:

  • 只有等于操作符可以使用符号 == 表示
  • ( 前面必须有空格!!!!
if 条件 (
    执行命令
) else (
    执行命令
)

4. 循环

for /l %%x in (1,1,10) do (
    echo 变量 x 的值是 %%x
)

:: 遍历指定目录所有文件
set "targetDir=C:\path\to\your\directory"
for /r "%targetDir%" %%f in (*) do (
    echo %%f
)

遍历指定目录的所有目录

@echo off
setlocal

:: 设置目标目录路径
set "targetDir=C:\path\to\your\directory"

:: 检查目标目录是否存在
if exist "%targetDir%" (
    echo 目标目录:%targetDir%
    echo.

    :: 使用 for /d 循环遍历目标目录中的所有子目录
    for /d %%d in ("%targetDir%\*") do (
        echo %%d
    )
) else (
    echo 目标目录 %targetDir% 不存在
)

endlocal

遍历文件中的每一行

@echo off
setlocal

:: 设置文件路径
set "filePath=C:\path\to\your\file.txt"

:: 检查文件是否存在
if exist "%filePath%" (
    echo 文件路径:%filePath%
    echo.

    :: 使用 for /f 循环遍历文件中的每一行
    for /f "delims=" %%l in (%filePath%) do (
        echo %%l
    )
) else (
    echo 文件 %filePath% 不存在
)

endlocal

5. 函数

exit /b [exitCode]

/b:选项表示结束当前的批处理脚本或子例程。
exitCode: 用于指定退出码。如果未提供 exitCode,则默认退出码为上一个命令的返回码。

@echo off

rem 定义函数
:myFunction
echo 这是我的函数
exit /b

rem 调用函数
call :myFunction
@echo off
call :main

::----------------------------------------------------
setlocal enabledelayedexpansion
rem 定义函数:获取字符串长度
:getStringLength
set "str=%~1"
set "len=0"
:loop
if defined str (
    set "str=!str:~1!"
    set /a "len+=1"
    goto loop
)
exit /b  rem 返回调用点
endlocal

::----------------------------------------------------
:main
call :getStringLength "Hello, World!"
echo Length of string is: %len%
call :getStringLength "Hello"
echo Length of string is: %len%

pause

6. 文件操作

:: 创建文件
echo Hello > myfile.txt
:: 复制文件
copy source.txt destination.txt
:: 移动文件
move source.txt destination_folder\
:: 重命名文件
ren oldname.txt newname.txt
:: 删除文件
del myfile.txt

:: 判断文件是否存在
set "filePath=C:\path\to\your\file.txt"
if exist "%filePath%" (
    echo 文件存在
) else (
    echo 文件不存在
)

7. 字符串操作

7.1 字符串连接

set str1=Hello
set str2=World
set result=%str1% %str2%
echo %result%

这将输出 Hello World。在批处理中,可以使用 % 符号来引用变量,并使用空格将字符串连接起来。

7.2 字符串截取

set myvar=abcdef
set substring=%myvar:~0,3%
echo %substring%

这将输出 abc。:~ 后跟的是截取的起始索引和长度。在这个例子中,0,3 表示从索引 0 开始截取,长度为 3。

7.3 字符串查找:

set myvar=abcdef
echo %myvar:~2%

这将输出 cdef。如果省略长度,则从指定的索引开始一直截取到字符串末尾。

7.4 字符串替换:

set myvar=abc123abc
set newvar=%myvar:abc=xyz%
echo %newvar%

8. 变量延迟

setlocal enabledelayedexpansion 用于启用延迟扩展(Delayed Expansion)模式,它是 Windows 批处理脚本中的一个特性。在启用延迟扩展后,! 可以用来获取变量的值,而不仅仅是 %。

在默认模式下,批处理脚本在执行代码块时会提前替换变量的值,因此如果在一个代码块中改变了变量的值,这个改变后的值在同一个代码块中将不会被正确地获取。启用延迟扩展后,可以使用 ! 来延迟获取变量的值,使得在代码块内部修改变量后,可以正确地获取到修改后的值。
endlocal 用于结束由 setlocal 开始的本地环境,恢复到调用 setlocal 之前的环境状态。

在批处理脚本中,setlocal 用于创建一个本地环境,这个本地环境中的变量和状态只对当前批处理文件有效,不会影响到其他批处理文件或者批处理文件的外部环境。endlocal 用于关闭这个本地环境,恢复到调用 setlocal 之前的环境状态。
这样做的好处是可以在脚本中创建临时的环境,进行一些操作,而不用担心对外部环境产生影响。通常在脚本的末尾会使用 endlocal 来确保脚本结束时本地环境被正确关闭,以免影响到其他的脚本执行。

可参考文件:链接

三、基本指令

注意,bat 脚本不区分大小写。

1. rem 和 ::

:: 用于进行文本的注释,执行后不会回显内容。
rem 用于文本注释,执行后会回显内容。

2. echo 和 @

@字符放在命令前将关闭该命令回显,⽆论此时echo是否为打开状态。

  • 打开回显功能:echo on
  • 关闭回显功能:echo off
  • 输出空行:echo.echo,echo:echo/
  • 显示当前echo状态:echo
  • 输出提示信息:echo 信息内容
  • 答复提问:echo 答复语|执行的操作
  • 新建文件:echo 文件内容>文件名
  • 新增内容:echo 文件内容>>文件名
  • 喇叭鸣响:echo ^g

3. pause

使当前程序暂停,并输出以下内容,作用是为了让我们知道程序运行到哪步了。
显示其他提示语:echo 其他提示语 & pause > nul

在这里插入图片描述

4. errorlevel

获取程序返回码:echo %errorlevel%
每个命令运⾏结束,可以⽤这个命令⾏格式查看返回码。⽤于判断刚才的命令是否执⾏成功,默认值为0,⼀般命令执⾏出错会设 errorlevel 为1。

5. title

设置cmd窗口的标题,语法如下:

title 我的窗口

在这里插入图片描述

6. color

设置默认控制台的前景色和背景色,语法如下:

color [前景色][背景色]

颜⾊属性由两个⼗六进制数字指定 – 第⼀个为背景色,第⼆个则为前景色。每个数字可以为以下任何值之⼀。

数值颜色数值颜色
0⿊⾊8灰⾊
1蓝⾊9淡蓝⾊
2绿⾊A淡绿⾊
3湖蓝⾊B浅绿⾊
4红⾊C淡红⾊
5紫⾊D淡紫⾊
6黄⾊E淡黄⾊
7⽩⾊F亮⽩⾊

示例如下:
在这里插入图片描述

7. goto 和 :

通过goto:标号可以实现跳转执行命令。

@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 GOTO start
pause

8. find

在文件中搜索字符串,语法如下:

find [/v][/c][/n][/i][/off[line]] "字符串" [[drive:][path]filename[...]]
  • /v 显示所有未包含指定字符串的行
  • /c 仅显示包含字符串的行数
  • /n 显示行号
  • /i 搜索字符串时忽略大小写
  • /off[line] 不要跳过具有脱机属性集的文件
  • “字符串” 指定要搜索的字符串
  • [drive:][path]filename 指定要搜索的文件

9. start

批处理中用来调用外部程序的命令,语法如下:

start 外部程序 [参数]

参数:

  • /D path 指定程序的起始目录
  • /MIN 最小化启动窗口
  • /MAX 最大化启动窗口
  • /WAIT 等待启动的程序结束后才继续脚本
  • /B 在同一窗口中启动程序
  • /b 隐藏控制台执行程序
    说明:
  • 该命令将在新进程中运行外部程序,原批处理程序将继续执行
  • 执行运行外部程序则会等待外部程序完成后再继续执行后续指令

示例:start explorer d:\ 将会使用图形界面打开D盘。

10. call

CALL命令可以在批处理执⾏过程中调⽤另⼀个批处理,只有当被调用的批处理执⾏完后,才能继续执⾏原来的批处理,语法如下:

call 指定批处理文件

11. assoc 和 ftype

assoc 和 ftype 可实现文件关联,语法如下:

assoc .txt	::显示.txt代表的“文件类型”,结果显⽰.txt=txtfile
ftype		::显示所有的文件类型关联

assoc .txt=Word.Document.8  ::设置.txt文件未word类型的文档,可看到.txt文件图标已改变

12. pushd 和 popd

主要用于保存并返回初始目录,示例如下:

cd /d d:\mp4 	::更改当前⽬录为 d:\mp4
pushd c:\mp3 	::保存当前⽬录,并切换当前⽬录为 c:\mp3
popd 			::恢复当前⽬录为刚才保存的 d:\mp4

13. if

条件判断语句,语法如下:

if [not] errorlevel number command
if [not] str1==str2 command
if [not] exist filename command

14. mode

@echo off
mode con: cols=80 lines=30

echo This is a sample batch script.
echo It sets the console window size to 80 columns by 30 lines.
pause

在这个例子中,mode con: cols=80 lines=30 设置控制台窗口的列数为80,行数为30。

四、常用特殊符号

1. @

用在任何命令前面,实现关闭当前行的回显.

2. %

%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*为命令⾏传递给批处理的参数
%0 批处理⽂件本⾝,包括完整的路径和扩展名
%1 第⼀个参数
%9 第九个参数
%* 从第⼀个参数开始的所有参数

%~dp0:批处理本身所在的路径

3. >

DOS的标准输⼊输出通常是在标准设备键盘和显⽰器上进⾏的,利⽤重定向,可以⽅便地将输⼊输出改向磁盘⽂件或其它设备。其中:

  • ⼤于号 > 将命令发送到⽂件或设备,例如打印机>prn
  • 双⼤于号 >> 将命令输出添加到⽂件结尾⽽不删除⽂件中已有的信息
  • ⼩于号 < 从⽂件⽽不是键盘上获取命令所需的输⼊
  • >& 符号将输出从⼀个默认I/O流(stdout,stdin,stderr)重新定向到另⼀个默认I/O流

4. >>

>>> 有点类似,但他们的区别是 >> 是传递并在⽂件的末尾追加,⽽ > 是覆盖。

五、实际案例

1. 设置临时环境变量

在命令行模式下设置的环境变量,属于临时环境变量,只针对当前的CMD命令窗口有效,并不影响其他窗口中的环境变量,更不会影响到永久性的环境变量,要设置永久的环境变量,需要通过图形操作修改。

CMD

set path=%path%;C:\test  ::在原有环境变量的基础上追加环境变量

PowerShell

$env:path+="C:\test"

2. 启动CMD执行命令

start cmd /k    ::启动一个CMD且不关闭CMD
start cmd /c    ::启动一个CMD且关闭CMD
start cmd /k  "命令1 & 命令2 & 命令3"     ::无论前面命令是否成功, 后面都会执行
start cmd /k "命令1 && 命令2 && 命令3 "   ::仅当前面命令成功时, 才执行后面,一般用这个
start cmd /k "命令1 || 命令2 || 命令3"    ::仅当前面命令失败时. 才执行后面

如果需要执行指定的脚本文件,请使用 call 命令,示例如下:

call test.bat

3. 打开环境变量窗口

rundll32 sysdm.cpl,EditEnvironmentVariables

4. 获取用户输入并显示

@echo off

set /p user_input=请输入内容:
echo 你输入的内容是:%user_input%

5. 执行外部程序后再执行脚本

@echo off

:: 打开指定软件
start notepad.exe

:: 延时5秒	
echo Waiting for 5 seconds...
timeout /t 5 /nobreak >nul		

:: 激活虚拟环境
echo Activating virtual environment...	
call .\venv\Scripts\activate		

:: 执行python脚本
python test.py

echo sucess!
echo Windows will close in 5 seconds...
timeout /t 5 /nobreak >nul

6. 执行命令并隐藏窗口

@echo off
start /b notepad	::打开记事本

7. 执行命令并最小化窗口

@echo off
start /min cmd /c "notepad"
@echo off
powershell -WindowStyle Minimized -Command "notepad"

8. 批量修改文件名

@echo off
setlocal enabledelayedexpansion

rem 设置文件所在目录路径
set "folderPath=C:\YourFolderPath"

rem 进入目标目录
cd %folderPath%

rem 循环处理每个文件
for %%F in (*) do (
    rem 获取文件名(带扩展名)
    set "fileName=%%F"

    rem 移除字母部分,保留数字
    set "newFileName="
    for /L %%I in (0, 1, 9) do (
        set "newFileName=!newFileName!!fileName:%%I=!"
    )

    rem 重命名文件
    ren "%%F" "!newFileName!"
)

endlocal

9. 批量修改文件夹名

@echo off
setlocal enabledelayedexpansion

rem 设置要处理的文件夹路径
set "folderPath=C:\Path\To\Your\Folder"

rem 遍历文件夹
for /d %%i in ("%folderPath%\*") do (
    rem 获取文件夹名
    set "folderName=%%~nxi"

    rem 清除字母
    set "folderNameWithoutLetters="
    for /L %%j in (0, 1, 9) do (
        set "folderName=!folderName:%%j=!"
    )

    rem 重命名文件夹
    ren "%%i" "!folderNameWithoutLetters!"
)

endlocal

10. 搜索文件夹

① 搜索当前目录是否存在以指定字符串结尾的文件夹

@echo off
setlocal enabledelayedexpansion

set "str=202412"  REM 替换为您要搜索的字符串
set /a length=6

echo 搜索到以下文件夹:
for /d %%i in (*) do (
    set "folder_name=%%i"
    set "last_characters=!folder_name:~-%length%!"  REM 将“长度”替换为您要检查的字符串的长度
    if "!last_characters!" == "%str%" (
        echo  "!folder_name!"
    )
)
endlocal

pause

11. 修改ip地址

@echo off


echo **************************************************************************

echo *                             修改IP地址、DNS                            *

echo **************************************************************************


set /p ip="请输入指定的IP:"

echo 正在修改IP地址和DNS服务器地址,请耐心等待…………

echo 正在更改本机IP地址...

netsh interface ipv4 set address name="以太网 5" source=static addr=%ip% mask=255.255.255.0 gwmetric=0 >nul

echo.
echo IP已修改为:[32m%ip%[0m
echo.
pause

参考资料:

https://www.jb51.net/article/250331.htm
http://www.taodudu.cc/news/show-3034558.html
https://www.w3cschool.cn/dosmlxxsc1/wvqyr9.html
https://www.runoob.com/linux/linux-shell-variable.html
https://www.hxstrive.com/subject/windows_bat.htm?id=36
https://cloud.tencent.com/developer/article/2118950
https://www.yiibai.com/batch_script/
https://zhuanlan.zhihu.com/p/415626343
http://t.csdn.cn/hJaPh
http://t.csdn.cn/3R7Be
http://t.csdn.cn/zFfr5
http://t.csdn.cn/JmcoH
http://t.csdn.cn/ui048

  • 29
    点赞
  • 220
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值