运维必学 | 字符串处理-从零开始学Windows批处理(Batch)编程系列教程

2023-10-31 17:22:04 浏览数 (1)

本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。

0x00 前言简述

描述: 不管是哪一门编程语言,最终都逃不过字符串的处理,通常是字符串的生成、替换、截取、匹配等相关操作,针对Windows中的批处理也是一样的,所以本章将主要介绍在批处理中针对字符串处理的相关实践知识。

温馨提示: Windows Batch 批处理系列教程示例脚本可访问作者Github仓库中DevelopLearnig的项目,✈直达-> https://github.com/WeiyiGeek/DevelopLearnig/tree/main/TerminalScript/bat


0x01 批处理(Batch)字符串处理

1.批处理中ASCII码的输入输出

描述: 计算机中最基本的编码ASCII码(用来实现人与计算机交流的)是美国信息交换标准码,共128个包括52个英文字母大小写、10个阿拉伯数字和英文标点及一些控制符, 它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。

由于计算机只能识别二进代码,所以ASCII码中每一个字符都由八位二进制数表示,其中二进制代码的最高位恒为零,为了方便人们记忆又将二进制代码转换为相应的十进制数为0~127,其中0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符)

在批处理的cmd窗口中, 我们可以通过任意一个字符的ASCII码来输入该字符(字母a-z对应97-122, 字母A-Z对应65-90),比如Ctrl G、Ctrl N、Ctrl I来输入^G/^N/^I, 而ASCII码大于26的字符,可以通过按住Alt键不松,通过小键盘输入ASCII码的十进制值,然后松开Alt键即可。

示例演示:

代码语言:javascript复制
# Day04/01.ascii.bat
@echo off

@REM 按键示例通过Ctrl   字母生成
echo ^Q^W^E^R^T^Y^U^O^P^A^D^K^K^L^L^Z^X^V^B^N

@REM 按键示例通过ALT   十进制(ASCII码)
alt 48
alt 49
alt 123
alt 124
alt 125

执行结果:

2.字符串常规处理

描述: 前面我们说过批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集。

在批处理中可实现的字符串处理功能有:截取字符串内容、替换字符串特定字段、合并字符串、扩充字符串等功能。

截取字符串

描述: 截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特定位置的一个或多个字符。

语法:

代码语言:javascript复制
# 基础格式: 
%a:~[m[,n]]%

# 使用说明: 
%a:~0,n%     相当于函数 left(a,n)  取左边n位
%a:~-m%      相当于函数 right(a,m) 取右边m位
%a:~m,n%     相当于函数 mid(a,m 1,n) 从m 1位开始取n位
%a:~m,-n%    相当于函数 mid(a,m 1,len(a)-m-n) 从m 1位开始,至倒数n 1位
%a:~m%       相当于函数 mid(a,m 1,len(a)-m) 或者 right(a,len(a)-m) 从m 1位开始取右边->全部
%a:~-m,n%    相当于函数 right(a,m) 从右边第m-1起然后再向后截取n个字符

示例演示:

代码语言:javascript复制
# day04/02.substring.bat
@echo off
@REM 批处理中截取字符串示例
cls
set ifo=0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ-abcdefghijklmnopqrstuvwxyz

@REM 截取前10个字符
echo 1.截取前10个字符
echo %ifo:~0,10%
echo.

@REM 截取后26个字符
echo 2.截取后26个字符
echo %ifo:~-26%
echo.

@REM 截取从第10个字符开始 1-向后截取27个字符
echo 3.截取从第10个字符开始 1向后截取27个字符
echo %ifo:~10,27%
echo.

@REM 截取从第23个字符开始 1,截取到后13个字符
echo 4.截取从第23个字符开始1,截取到后13个字符
echo %ifo:~23,-13%
echo.

@REM 截取从第23个字符开始 1,截取向右最的后字符
echo 5.截取从第23个字符开始 1,截取向右最的后字符
echo %ifo:~23%


@REM 截取从后数第53个字符开始 1,然后从这截取到得部分向后截取26个字符
echo 6.截取从后数第53个字符开始 1,然后从这截取到得部分向后截取26个字符
echo %ifo:~-53,26%
pause

执行结果:

代码语言:javascript复制
1.截取前10个字符
0123456789

2.截取后26个字符
abcdefghijklmnopqrstuvwxyz

3.截取从第10个字符开始 1向后截取27个字符
-ABCDEFGHIJKLMNOPQRSTUVWXYZ

4.截取从第23个字符开始1,截取到后13个字符
MNOPQRSTUVWXYZ-abcdefghijklm

5.截取从第23个字符开始 1,截取向右最的后字符
MNOPQRSTUVWXYZ-abcdefghijklmnopqrstuvwxyz

6.截取从后数第53个字符开始 1,然后从这截取到得部分向后截取26个字符
ABCDEFGHIJKLMNOPQRSTUVWXYZ
替换字符串

描述: 在批处理中,我们可以非常方便的将某一字符串中的特定字符或字符串替换为给定的字符串.

语法说明:

代码语言:javascript复制
%PATH:被替换字符串=替换字符串%

示例演示:

代码语言:javascript复制
# day04/03.replacestring.bat
@echo off
:: # 批处理中字符串替换示例
cls
set url=www.weiyigeek.top
echo url 替换前 %url%
echo url 替换后 %url:www=blog% 

@REM 上述替换操作并不会改变变量url的值
echo url = %url%

@REM 若替换后用set重新赋值则变量url将会改变
set "url=%url:www.=share.%"         
echo "url => %url%"

@REM 将系统时间不足两位的以0补齐。
set hour=%time:~0,2%
echo 替换前的hour值=%hour%
set "hour=%hour: =0%"
echo 替换后的hour值=%hour%
pause

执行结果:

代码语言:javascript复制
url 替换前 www.weiyigeek.top
url 替换后 blog.weiyigeek.top

url = www.weiyigeek.top
"url => share.weiyigeek.top"

替换前的hour值= 9
替换后的hour值=09

温馨提示: 如上述代码所示,若需要修改替换前的变量为替换后的结果,我们需要使用set命令进行设置。

拼接字符串

描述: 在批处理中,与大多数编程语言一样也需要针对字符串进行拼接,而在Bat中类似于Shell只需要将两个存放字符串的变量放在一起即可,你也不需要关心其数据类型。

示例演示:

代码语言:javascript复制
# day04/04.concateString.bat
@echo off
:: # 批处理中字符串拼接示例
cls
set name="Weiyi"
set lastname="Geek"
set age=88
set section="中国梦,我的梦"
echo %name%%lastname%
echo "age => %age%"
:: 此处需要注意其双引号
set "section=%name%%lastname% %section% ,my age is %age%."
pause

执行结果:

代码语言:javascript复制
Weiyi Geek "中国梦,我的梦"
"age => 88"
WeiyiGeek "中国梦,我的梦" ,my age is 88.
扩充字符串

描述:“扩充”这个词汇来自于微软自己的翻译,意思就是对表示文件路径的字符串进行特殊的处理,其实我们在变量那一章节就简单的涉及,此处作者将作为其扩展与补充:

扩充字符串一览

扩充变量

备注说明

示例

%~I

删除任何引号("),扩充 %I

05.expandStringVar.bat

%~dI

仅将 %I 扩充到一个驱动器号

L:

%~pI

仅将 %I 扩充到一个路径

GitProjectDevelopLearnigTerminalScriptBatDay04

%~dpI

[组合修饰符]仅将 %I 扩充到一个驱动器号和路径

L:GitProjectDevelopLearnigTerminalScriptBatDay04

%~nI

仅将 %I 扩充到一个文件名

05.expandStringVar

%~xI

仅将 %I 扩充到一个文件扩展名

.bat

%~nxI

[组合修饰符] 仅将 %I 扩充到一个文件名和扩展名

05.expandStringVar.bat

%~fI

将 %I 扩充到一个完全合格的路径名

L:GitProjectDevelopLearnigTerminalScriptBatDay045.expandStringVar.bat

%~sI

扩充的路径只含有短名

L:GITPRO~1DEVELO~1TERMIN~1BatDay045EXPA~1.BAT

%~fsI

仅将 %I 扩充到一个带有短名的完整路径名

L:GITPRO~1DEVELO~1TERMIN~1BatDay045EXPA~1.BAT

%~aI

将 %I 扩充到文件的文件属性

--a--------

%~tI

将 %I 扩充到文件的日期/时间

2023-07-16 09:21

%~zI

将 %I 扩充到文件的大小

566

%~$PATH:I

查找列在路径环境变量的目录,并将 %I 扩充

L:

%~dp$PATH:I

查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。

L:GitProjectDevelopLearnigTerminalScriptBatDay04

%~ftzaI

将 %I 扩充到类似输出线路的 DIR 以及Linux中的ll命令

--a-------- 2023-07-16 09:21 566 L:GitProjectDevelopLearnigTerminalScriptBatDay045.expandStringVar.bat

温馨提示: 上述I代表变量I,不过需要说明的是,不是所有的变量都能够进行扩充的,有两个条件一是该字符串代表一个文件路径;二是变量要用%x来表示,x可取a-z A-Z 0-9共62个字符中的任意一个。

温馨提示: 如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串。

示例演示:

代码语言:javascript复制
@echo off
@REM 批处理中扩充字符串示例,此处以0来做变量演示
echo 完全路径:%0
echo 去掉引号:%~0
echo 所在分区:%~d0
echo 所处路径:%~p0
echo 文件名:%~n0
echo 扩展名:%~x0
echo 路径和带有短文件名:%~f0 = %~s0
echo 文件属性:%~a0
echo 修改时间:%~t0
echo 文件大小:%~z0
@REM 可以用上面的修饰符进行重新组合,达到的扩充字符串!
echo 驱动器号和路径:%~dp0
echo 文件名和扩展名:%~nx0
echo 完整路径名带有短文件名:%~fs0
echo 相当于Linux中ll命令显示的的效果:
echo %~ftza0
echo 当前环境变量分区:%~ds$PATH:0
echo 当前环境变量路径与短文间名称:%~fs$PATH:0
pause

执行结果:

代码语言:javascript复制
Day04>05.expandStringVar.bat
完全路径:05.expandStringVar.bat
去掉引号:05.expandStringVar.bat
所在分区:L:
所处路径:GitProjectDevelopLearnigTerminalScriptBatDay04
文件名:05.expandStringVar
扩展名:.bat
路径和带有短文件名:L:GitProjectDevelopLearnigTerminalScriptBatDay045.expandStringVar.bat = L:GITPRO~1DEVELO~1TERMIN~1BatDay045EXPA~1.BAT
文件属性:--a--------
修改时间:2023-07-16 09:29
文件大小:570
驱动器号和路径:L:GitProjectDevelopLearnigTerminalScriptBatDay04
文件名和扩展名:05.expandStringVar.bat
完整路径名带有短文件名:L:GITPRO~1DEVELO~1TERMIN~1BatDay045EXPA~1.BAT
相当于Linux中ll命令显示的的效果:
--a-------- 2023-07-16 09:29 570 L:GitProjectDevelopLearnigTerminalScriptBatDay045.expandStringVar.bat
当前环境变量分区:L:
当前环境变量路径与短文间名称:L:GITPRO~1DEVELO~1TERMIN~1BatDay045EXPA~1.BAT

本文至此完毕,更多技术文章,尽情等待下篇好文!

原文地址: https://blog.weiyigeek.top/2023/7-7-761.html

0 人点赞