声明
该文档用于我本人快速查阅,辅助基于windows的批处理代码阅读
批处理知识1
::========================
::批处理基础知识学习1
::2024-7-23
::========================
::注释的两种方法
REM annotation type1(this type will show infomation at the code windows)
:: annotation type2(this type will not be use to bat runing )
@echo off
::===使用echo off(回显)只显示输出结果,不输出过程,相当与print
echo ===PART1====
echo hello world!
echo 展示回显效果(use chinese will show error code)
echo today is %date%
echo ===PART2====
::===赋值操作
set name=world
echo hello %name%!
echo ===PART3====
::===判断操作
::set /p age=plase input your age:
::if %age% GEQ 18(
::echo you have been an adulthood!
::) else (
::echo you not an adult!
::)
echo ===PART4====
::===循环语句
for /l %%i in (1,1,5) do (
echo this is the %%i times loop
)
echo ===PART5====
::===文件操作(直接操作时在当前bat文件路径下执行)
::==复制(如文件已存在会直接覆盖文件)
copy ts111.txt ts222.txt
copy ts111.txt ts333.txt
echo copy complish!
::==删除
del ts222.txt
echo delete complish!
::==重命名
ren ts333.txt ts444.txt
echo rename complish!
::=======================独立使用==========================
echo ===PART6====
::===自动化备份
set src=D:\Ztest\src\AAA
set dst=D:\Ztest\backup
xcopy %src% %dst% /s/e/y
xcopy /?
echo backup complish!
::==必须参数说明==
::语法格式为xcopy %s变量A% %变量B% /必须参数
:: /? 在命令提示符下显示帮助。
:: /s 复制目录和子目录,除非它们是空的。 如果省略 /s,则 xcopy 在单个目录中运行。
:: /e 复制所有子目录,即使它们是空的。 将 /e 与 /s 和 /t 命令行选项结合使用。
:: /y 禁止提示你确认覆盖现有目标文件。
echo ===PART7====
::===系统环境变量配置
setx PATH "%PATH%";C:\my_program\bin"
echo change sysPath complish!
pause
批处理知识2
::========================
::批处理基础知识学习2
::2024-7-23
::========================
::注释的两种方法
REM 这是第一种注释
rem 这是第一种注释
:: 这是第二种注释
@echo off
echo ==================PART1================
rem ==================基本输出语法================
::========================
::回显语法格式: echo [on/off] [message]
::========================
::执行完脚本后不立即关闭窗口 pause
::========================
::自定义批处理程序窗口标题 title [XXX]
::========================
::自定义文本颜色 color [背景色][字体色],可以使用color help来获取更多信息
::========================
::自定义命令行窗口大小 mode con cols=[宽度] lines=[高度]
::========================
::设置标题为test2
title test2
::调整颜色配置为:0黑色背景2绿色字体
color 02
::自定义命令行窗口大小
mode con cols=100 lines=25
echo hello world!
echo today is %date%
rem 按下任意键继续
echo hello &pause > nul
::========================
::使中文可以在cmd窗口使用
chcp 65001
echo 你好!
chcp
echo ==================PART2================
rem ==================基本输入语法================
::========================
::重定向符> 和 >>
::>会覆盖文件中已有内容,>>会将结果追加到指定文件后面
::========================
::接收文件参数
::echo param0=%0
::echo param1=%1
::接收多个文件参数
::echo %0 %1 %2
::shift /0
::=============set命令基础用法===========
::目标代码语法解释
::set [环境变量值=[指定变量值]]
::===赋值操作===
set name=world
echo hello %name%!
::===显示、设置或删除cmd环境变量===
::显示当前java环境变量
set java_home1
::=======set拓展/a(运算)的使用=======
::目标代码语法解释
::set /a [环境变量值=[指定变量值运算]]
::使用任何逻辑或取余操作符,则需要将表达式字符串用引号括起来
::使用/a执行加法运算
set /a val=10+22
echo %val%
set /a val2=%val%+22
echo %val2%
::将16使用位移操作符向右移动一位,等同于除以2,val3=16/2=8
set /a "val3=16>>1"
echo %val3%
::使用分组符号提升加法的优先级
set /a val4=(1+2+3)*3
echo %val4%
::使用%%执行取余运算
set /a val5=5%%2
echo %val5%
::如果一个变量未被定义,默认值为0
set /a val6=tmp+2
echo %val6%
::=======set拓展/p(输入)的使用=======
::目标代码语法解释
::set /p [环境变量值=[提示字符串]]
set/p name=please input your name:
echo %name%
::=======setlocal/endlocal=======
::局部区域修改path
echo before reset
set path
setlocal
echo resetPath
set path=D:\Ztest
set path
endlocal
echo after reset path
set path
::=============shift命令基础用法===========
::目标代码语法
::shift /?
::使用该命令更改处理文件处理参数的方式,如指定处理参数的位置等
::=============获取磁盘路径===========
rem 获取当前脚本所在路径%cd%
set basePath=%cd%
echo %basePath%
rem 获取当前脚本所在路径%~dp0
::使用该路径获取批处理文件的实际路径,与当前DOS环境所在目录没有任何关系
::d为Drive的缩写,表示驱动、磁盘
::p为Path的缩写,表示路径和目录
::不推荐使用cd,推荐使用cd /d %~dp0
::=============字符串截取操作===========
::目标代码语法 截取字符串从n开始的m个字符
:: %var:~n,m%
set str=ABCDEFGHIJKLMN
echo %str%
rem 截取前5个字符串
echo %str:~0,5%
rem 截取前5个字符串以外的其他字符串
echo %str:~5%
rem 截取最后5个字符串
echo %str:~-5%
echo %str:~-5,5%
rem 截取第1个到倒数第5个字符
echo %str:~0,-5%
rem 截取倒数第7个开始的后面5个字符
echo %str:~-7,-5%
::=============字符串替换操作===========
::目标代码语法 替换X为XX
:: %var:x=xx%
set str=ABCDEFGHIJKLMN
echo %str%
rem 字符串替换
echo %str:CD=ZK%
rem 利用字符串替换功能,实现查找字符串是否包含指定字符(执行中存在问题)
set str1=hello,this is my function
echo %str1%
set "tmpstr=%str1:function%"
echo %tmpstr%
if "%str1%==%tmpstr%"(
echo error,not found
) else (
echo exist aim str
)
::=============字符串合并操作===========
set str1=ABCD
set str2=EFGH
echo %str1%
echo %str2%
rem 字符串合并
echo %str1%%str2%
set str=%str1%%str2%
echo %str%
echo ==================PART3================
rem ==================基本逻辑语法================
::=============if语句===========
::目标代码语法
:: if [not] errorlevel num command
::not取反,errorlevel number表示最后运行的程序返回一个等于或大于指定数字的退出代码指定条件为True
:: if [not] str1==str2 command
::判断字符是否相等
:: if [not] exist filename command
::判断文件是否存在
::
set /p pwd=plase input password:
if %pwd%==123456 echo sccess
if not %pwd%==123456 echo error
set file=D:\Ztest\test\AAA.txt
if exist %file% echo %file% exist
if not exist %file% echo %file% not exist
::=============if-else语句===========
::目标代码语法
:: if [not] errorlevel num command
set /p pwd=plase input password:
if "%pwd%"=="123456" (
echo sccess
) else (
echo error
)
::=============if-else-else语句===========
::目标代码语法
:: if [not] errorlevel num command
set /p score=plase input score:
if %score% lss 60 (
echo less then 60
) else if %score% lss 70 (
echo over 60 but not good
) else (
echo great
)
::=========逻辑判断操作与逻辑符参数==========
::equ 等于
::neq 不等于
::lss 小于
::leq 小于或等于
::gtr 大于
::geq 大于或等于
::/I 表示不区分大小写
::defined 同exist,还可用于取环境变量
::====逻辑运算符====
可以使用AND,OR,NOT组合条件
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
set val =10
if defined val echo val=%val%
if not defined val echo not set val path
if defined myPath echo val=%myPath%
if not defined myPath echo not set myPath val
::=========goto语句==========
::退出也可以用exit
setlocal
set /p data=please input A or B:
if "%data%"=="A" goto A
if "%data%"=="B" goto B
echo you not input anything
goto endlocal
:A
echo you input A
goto end
:B
echo you input B
goto end
:end
echo ==================PART4================
rem ==================循环语法================
::=========for语句基础==========
::%I和%%I表示循环变量,循环次数需要指定一个有效的集合用来迭代,其中,人工集合中有多个用空格代表的项时
::for循环将对这些项进行迭代
::语法格式:for [循环变量] in [有效集合] do ( [循环代码段] )
::简单示例
::只能在cmd中执行指令,%符号在命令提示符中是拓展的
for %I in (ABC) do echo %I
::在批处理文件中需要使用%%I表示循环变量
for %%I in (ABC) do echo %%I
::=========for语句循环实例2==========
for %%I in (A B C D E) do echo %%I
for %%I in (A;B;C;D;E) do echo %%I
for %%I in (A,B,C,D,E) do echo %%I
for %%I in (A=B=C=D=E) do echo %%I
::=========for语句循环实例3==========
::打印当前目录下所有文件名称
for %%I in (*.*) do echo "%%I"
::打印当前目录下所有文件后缀为txt的文件名
for %%I in (*.txt) do echo "%%I"
::=========for语句循环实例4 /D文件夹遍历==========
::匹配当前目录文件
for %%i in (*) do echo "%%i"
::匹配目录下的所有目录,不包含子目录
for /D %%i in (*) do echo "%%i"
::搜索D盘下的所有目录,不包括子目录
for /D %%i in (C:/*) do echo "%%i"
::=========for语句循环实例5 /R 拓展==========
::搜索当前目录下所有文件
for /r %%i in (*) do echo "%%i"
::输出所有D盘下的目录,包含子目录
for /r d:/ %%i in (.) do echo "%%i"
::搜索D盘所有扩展名为txt的文件
for /r d:/ %%i in (*.txt) do echo "%%i"
::=========for语句循环实例6 搜索D盘是否有指定程序,如果存在则启动==========
::搜索当前目录下所有文件
for /r d:/ %%i in (codeblocks-20.03-setup-nonadmin.exe) do (
if exist %%i (
echo find aim function
::启动程序
start %%i
goto end
)
)
echo not find
:end
::=========for语句循环实例7 /L 拓展==========
::L拓展表示以增量形式从start以每次增加step,直到end的一个数字序列,如果start<end就会执行,反之停止
::遍历1-5,步长为2
for /L %%i in (1,2,5) do echo %%i
::遍历1-10,步长为2
for /L %%i in (1,2,10) do echo %%i
::遍历5-1,步长为-2
for /L %%i in (5,-2,1) do echo %%i
::遍历10-1,步长为-2
for /L %%i in (10,-2,1) do echo %%i
::=========for语句循环实例8 /L 拓展(创建指定数量文件夹)==========
::遍历5-1,步长为1
for /L %%i in (1,1,5) do (
::创建文件夹
md 文件%%i
)
::=========for语句循环实例8 /F 拓展==========
::主要用来处理文件和一些命令的输出结果,还可以提取文本文件的内容
::数据如下
name#age#score
van#24#95
sanbei#24#100
::代码
::普通提取名字
echo nomal get name
for /F %%i in (test.txt) do (
echo %%i
)
::eol=X 省略指定字符开头的行
echo eol=c ignore aim word
for /F "eol=#" %%i in (test.txt) do (
echo %%i
)
::skip=n 从文件头跳过的行数
echo skip=n
for /F "skip=2" %%i in (test.txt) do (
echo %%i
)
::delims=# 使用指定字符分割内容,如有空格放到最后
echo delims=#
for /F "delims=#|,|" %%i in (test.txt) do (
echo %%i
)
::===精准提取===
::使用tokens与delims结合可以精准提取指定数据
::tokens=x,y,m-n
::tokens=m 表示提取第m列
::tokens=m,n 表示提取第m列和n列
::tokens=m-n 表示提取第m列至n列
::tokens=* 表示忽略行首所有空格
::tokens=m* 表示提取第m列以后所有字符
::delims=# 使用指定字符分割内容,如有空格放到最后,且指定第三列
echo USE delims=#, tokens=3
for /F "delims=#|,|,tokens=3" %%i in (test1.txt) do (
echo %%i
)
echo ==================PART5================
rem ==================程序调用指令call================
::=========call指令基础==========
::call命令可以在普通批处理中调用另一个批处理程序,而且还可以调用指定标号后面的所有命令(子程序)
::=========call调用实例1 调用外部程序==========
::语法
::call [bat文件名] [传参] [传参]
::传递的参数用%1,%2接收
::=========call调用实例2 调用子程序==========
::语法
::call [label] [arguments]
::label用于指定调用的位置标签,类似goto
::arguments对于以label开头的批处理程序或子程序,
::指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理参数或变量
call :sub
goto end
::子程序标签
:sub
echo sub label
::结束标签
:end
::=========call调用实例2 调用子程序传参==========
::语法
::call [label] [arguments]
::label用于指定调用的位置标签,类似goto
::arguments对于以label开头的批处理程序或子程序,
::指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理参数或变量
call :sub2 10
goto end
::子程序标签
:sub2
::%0对应sub2,%1对应10
echo arg0=%0 arg1=%1
::在主程序中用于cmd返回并等待下一命令,作用相当于exit
goto :eof
::结束标签
:end
::=========call调用实例2 增强拓展(%n)==========
::用于将传递参数拓展完整使得结果更便于处理
echo %~1 删除引号("),拓展%1
echo %~f1 拓展%1到一个完全合格的路径名
echo %~d1 拓展%1到一个驱动器号
echo %~p1 仅拓展%1到一个路径
echo %~n1 仅拓展%1到一个文件名
echo %~x1 拓展%1到一个文件拓展名
echo %~s1 拓展路径只含有短名
echo %~a1 拓展%1到文件属性
echo %~t1 拓展%1文件的日期和时间
echo %~z1 拓展%1拓展文件大小
echo %~$PATH:1 查找在PATH环境变量的目录,并将%1拓展到找到第一个完全合格的名称,未找到会拓展空字符串
::将增强符组合可以取得多重结果
echo %~dp1 拓展%1到驱动器号和路径
echo %~nx1 拓展%1到文件名和扩展名
echo %~dp$PATH:1 在列在PATH环境变量中的目录里查找%1,并扩展到找到第一个文件的驱动器号和路径
echo %~ftza1 将%1拓展到类似DIR的输出行
::=========call调用实例3 ==========
::生成临时文件,设置指定目录,调用子程序作为拓展,再恢复当前目录调用子程序
echo get a temp file>tmp.txt
::保存当前目录再设置指定目录为当前目录
pushd d:\ztest
call :sub tmp.txt
::恢复前次的当前目录
popd
call :sub tmp.txt
pause
del tmp.txt
goto :end
:sub
::设置中文编码
chcp 65001
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
chcp
goto :end
::goto :eof
:end
pause
::===============END===============
pause
批处理知识3
::========================
::批处理基础知识学习进阶
::2024-8-18
::========================
::注释的两种方法
REM 这是第一种注释
rem 这是第一种注释
:: 这是第二种注释
@echo off
rem ==================##文件操作##================
rem =====##*1*-START命令##====
::寻求帮助
start /?
::====实例1====
::启动当前路径某个程序
start XXX.exe
::启动一个子脚本并设置title为666
start "666" XXX.bat
::====实例2====
::以最小化窗口启动当前路径某个程序
start /min XXX.exe
::以最大化窗口启动当前路径某个程序
start /max XXX.exe
::检测 打开的程序是否关闭
start /wait XXX.exe
::====实例3====
::打开指定网址(使用系统默认浏览器)
start www.baidu.com
rem =====##*2*-路径切换命令##====
::主要是pushd命令和popd命令
::一般用于保存当前路径,并且切换到指定的新路径
::语法:pushd [path | ...]
::path指定切换路径
::====实例1====
::通过dos窗口(cmd)切换到D盘,然后恢复(相当于cd)
pushd D:\
::返回刚刚的路径位置
popd