一、bat是什么?
1.1 简单介绍
bat文件是dos下的批处理文件。bat文件它可以执行重复性任务,bat文件扩展名为 .bat 或 .cmd。
bat 是batch的缩写,直译为批处理。bat文件是存在于dos/windows中的脚本文件,bat的直接操作对象是dos命令,dos命令是system32下的exe或者cmd可执行程序的子集,长驻于内存中,具有简单、处理速度快的特点,取名为批处理毫无争议,也是非图形shell在windows操作系统中的直接体现,可以使用文本编辑器编写,保存为.bat格式。
bat的基本组成部分有数据类型、关键字、特殊符号、控制语句、命令、命令嵌套等。编制完整的bat脚本需要记忆较多的关键字、特殊符号,命令。当然,命令可以使用帮助查看。之后就是这些基本组成部分的搭配使用了。
1.2 bat文件
1.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令。可以使用任何文本文件编辑工具创建和修改。
2.批处理是一种简单的程序,可以用 if 和 goto 来控制流程,也可以使用 for 循环。
3.批处理的编程能力远不如C语言等编程语言,也十分不规范。
4.每个编写好的批处理文件都相当于一个DOS的外部命令,把它所在的目录放到DOS搜索路径(path)中,即可在任意位置运行。
5.C:\AUTOEXEC.BAT 是每次系统启动时都会自动运行的,可以将每次启动时都要运行的命令放入该文件中。
6.大小写不敏感(命令符忽略大小写)
7.批处理的文件扩展名为 .bat 或 .cmd。
8.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe来运行该文件。
参考指令可以看这篇文章:https://blog.csdn.net/qq_43331089/article/details/124222342
二、第一个bat文件
在记事本中编辑 并且保存在.bat文件 双击运行或者在cmd的命令下运行
代码如下(示例):
@echo off
set p=jasidfjaoidfja
echo %p%
这是输出p的代码 echo可以理解为输出指令 变量的话用%%括上 set是定义变量
第一行的@echo off是关闭回显
2.1 注释
REM和::用来添加注释:
代码如下(示例):
@echo off
REM 这一行是注释
:: 这一行也是注释
echo Hello bat
pause
REM、echo、pause都是命令。详情请点
2.2 变量
@echo OFF
SET var1=hello
ECHO %var1%
SET var2=7
ECHO %var2%
PAUSE
输出
hello
7
注意:
请不要在等号两边加空格,比如SET name=Apple是正确的,SET name = Apple不正确。
2.3 /A求表达式的值
@echo OFF
SET var=2+2
ECHO %var%
PAUSE
这里面输出的话是2+2 而不是4
@echo OFF
SET /A var=2+2
ECHO %var%
PAUSE
这样输出为4
检查一个变量是否存在
可使用以下语句来判断 “MyVar” 是否存在。
IF DEFINED MyVar (ECHO It IS defined) ELSE (ECHO It is NOT defined)
2.4 全局变量和局部变量
默认情况下,所有变量都是全局变量。
而在SETLOCAL和ENDLOCAL之间被赋值的变量就是局部变量。
@echo OFF
SETLOCAL
SET var=hello
ECHO %var%
ENDLOCAL
PAUSE
输出hello
2.5 语句写入
if语句
@echo OFF
SET a=1
SET b=2
SET c=2
IF %a%==%b% (echo They are equal) ELSE (echo They are diffrent)
IF %b%==%c% (echo They are equal) ELSE (echo They are diffrent)
PAUSE
输出
They are diffrent
They are equal
判断命令
if \"%1\"==\"/a\" echo 第一个参数是/a
if /i \"%1\" equ \"/a\" echo 第一个参数是/a
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
if exist c:\test.bat echo 存在c:\test.bat文件
if not exist c:\windows (
echo 不存在c:\windows文件夹
)
if exist c:\test.bat ( echo 存在c:\test.bat ) else ( echo 不存在c:\test.bat )
for循环
FOR %%变量 IN 列表 DO 一些事情
@echo OFF
FOR %%i IN (1 2 3) DO ECHO %%i
PAUSE
输出
1
2
3
/L
表示在一个范围中,语法如下:
::FOR /L %%变量 IN (最小值, 增量, 最大值) Do 一些事情
@echo OFF
FOR /L %%i IN (0, 2, 10) DO ECHO %%i
PAUSE
输出
0
2
4
6
8
10
循环路径中的文件 它将输出 “D:/test/” 文件夹下的所有文件
@echo OFF
FOR %%f IN (D:/test/*) DO @ECHO %%f
PAUSE
2.6 函数
使用:函数
来定义函数,使用CALL :函数
来调用函数。
比如调用一个能做乘法运算的函数:这里面的%~1指的是第一个参数
exit命令: exit /B 返回值
@echo OFF
CALL :test_function 3, 7
EXIT /B 0
:test_function
SET /A result=%~1*%~2
ECHO %result%
PAUSE
EXIT /B 0
输出
21
关于具体用法 可以for /?自行查看
三、项目案例中.bat文件的应用
cd %~dp0:
进入批处理本身所在位置,即E:/test
chcp 65001 rem 这是UTF-8的意思
set tm1=%time:~0,2%
set tm2=%time:~3,2%
set tm3=%time:~6,2%
set dt1=%date:~0,4%
set dt2=%date:~5,2%
set dt3=%date:~8,2%
::设定变量&赋值,格式为“set”+[空格]+[变量]+“=”+“值”
::值的格式:“量”(如time)+“:”+“~”+“取的位数”+“,”+“值的位数”(自动补零使用)
echo.
::输出空行
echo 现在是北京时间:
::输出文字
echo.
::输出空行
echo %dt1%年%dt2%月%dt3%日 %tm1%时%tm2%分%tm3%秒
::实现时间的显示
copy /b *.png+*.zip 成品.png
::主功能命令
pause
::显示“按任意键继续…”
set tm1=%time:~0,2%
set tm2=%time:~3,2%
set tm3=%time:~6,2%
set dt1=%date:~0,4%
set dt2=%date:~5,2%
set dt3=%date:~8,2%
echo.
echo 现在是北京时间:
echo.
echo %dt1%年%dt2%月%dt3%日 %tm1%时%tm2%分%tm3%秒
echo.
echo 合并请输入“1”后回车执行。
echo.
echo 分解请输入“2”后回车执行。
echo.
echo 退出请输入“3”后回车执行。
:cho ::这是开始循环的意思
set choice=
echo.
set /p choice=请选择:
IF NOT "%choice%"=="" SET choice=%choice:~0,1%
::如果内容不为 ↓ 的内容,则继续执行。
if /i "%choice%"=="1" goto hecheng
::如果内容为“1”,执行hecheng标签。
if /i "%choice%"=="2" goto tiquyasuobao
if /i "%choice%"=="3" goto exit
echo 选择无效,请重新输入。
echo.
goto cho
::回到cho标签。
@echo off
::关闭回显。
echo.
:hecheng
::命令标签
copy /b *.png+*.zip 成品.png
pause
goto menu
::结束
:tiquyasuobao
for /f "delims=" %%a in ('dir /a-d /b 欲分解.png') do (
ren "%%~a" "分解后.zip"
)
::更改文件名。
pause
goto menu
:exit
@ECHO OFF
goto menu
::退出