批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集。批处理中可实现的字符串处理功能有:截取字符串内容、替换字符串特定字段、合并字符串、扩充字符串等功能
下面对这些功能一一进行讲解。
截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特定位置的一个或多个字符。举例说明其基本功能:
当然,上面的例子只是将字符串处理的基本功能展示出来了,还看不出字符串处理具体有什么用处。下面这个例子是对时间进行处理。
2、替换字符串 替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串。举例说明其功能:
对于上面的例子有一点说明,对比两个echo aa = %aa%可以发现,如果要修改变量aa的内容的话,就需要将修改结果“%aa:中国=中华人民共和国%”赋值给变量aa。上面的字符串截取也有着同样的特点。
其实,合并字符串就是将两个字符串放在一起就可以了。举例说明:
同样,如果要改变变量aa的内容的话,就需要将合并结果“%aa%%bb%”赋值给变量aa。
“扩充”这个词汇来自于微软自己的翻译,意思就是对表示文件路径的字符串进行特殊的处理,具体功能罗列如下:
%~fI - 将 %I 扩充到一个完全合格的路径名
%~dI - 仅将 %I 扩充到一个驱动器号
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~sI - 扩充的路径只含有短名
%~aI - 将 %I 扩充到文件的文件属性
%~tI - 将 %I 扩充到文件的日期/时间
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩充到
可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个驱动器号和路径。
以上内容引用于for /?帮助信息。其中的I代表变量I,不过需要说明的是,不是所有的变量都能够进行扩充的,有两个条件:1、该字符串代表一个文件路径;2、变量要用%x来表示,x可取a-z A-Z 0-9共62个字符中的任意一个。举例说明:
其中的%0是批处理里面的参数,代表当前运行的批处理的完全路径。类似的还有%1-%9,分别代表传递来的第1-9个参数。例子如下:
其中,变量aa在之前是不可以扩充的,通过call命令并将aa作为参数传递给子函数:deal,将aa变量转换成了变量%1,即符合%x格式,从而可以进行字符串扩充。
至于%x中x取a-z A-Z的形式,可以复习一下for语句,for语句里面的变量就是用%x来表示的,因而可以直接进行扩充。
下面是其它网友的补充:注意是与c语言做了一些对比
首先说一下,批处理和高级语言不同,没有字符串处理函数,比如strcat之类的,但是却可以利用环境变量来实现这些函数的功能。
本文对照C语言中的字符串处理函数,讲解在批处理中的实现方法。
首先说一下字符串的存储,在C语言中,采用字符数组或者字符指针来存储字符串,而BAT中没有这些东东,所以要依靠环境变量来存储。
设置环境变量的语句为set语句,本文不详细介绍了,参考set /?语句。
1、C语中的strcpy函数,将一个字符串复制到另一个字符型指针或字符数组,覆盖原来的字符串。
C语言中的调用方法:strcpy(目标字符串,源字符串)
在批处理中的实现方法:
set 目标字符串=%源字符串%
2、C语中的strcat函数,将一个字符串连接到另一个字符型指针或字符数组的末尾。
C语言中的调用方法:strcat(目标字符串,源字符串)
在批处理中的实现方法:
set 目标字符串=%目标字符串%%源字符串%
3、字符串截取,C中没有这种函数,不过可以通过语句实现,不再介绍,直接说批处理的。
set 目标字符串=%源字符串:~起始值,截取长度%
注意,起始值从0开始!
截取长度是可选的,如果省略逗号和截取长度,将会从起始值一直截取到字符串的结尾。
4、C语中的strlen函数,取得字符串的长度。
C语言中的调用方法:strlen(字符串)
在批处理中的实现方法是利用goto和标签,形成循环结构,不断将字符串截短1字符,并用变量记录截短的次数,直到字符串变成空串。
5、C语中的strchr函数,在一个字符串中查找一个字符的首次出现位置,找到时返回所在位置,找不到时返回0值。
批处理中的思路:不断截短字符串,并取截短后字符串中的首字符,和要求的字符比较,如果相同就利用goto语句跳出循环,输出结果,如果没有相同的字符,执行到最后就输出0值。
最后出几道题,看看大家学习的怎么样!
(1)如何实现C语言中strstr函数的功能?
提示:strstr函数的功能是在字符串1中查找字符串2,找到时返回串2首次出现的位置,否则返回0值。与strchr区别就是,第二个参数是字符串,而不是字符了。
(2)如何用批处理构建while循环?
提示:while循环一般格式为:
其中,循环体为0条或多条语句,break用于跳出循环,continue用于直接判断表达式并决定是否进入下一次循环。
一般执行顺序:首先判断表达式,如果成立则进入循环,循环体执行完毕后再次判断表达式的值,决定是否再次循环。
提示:do-while循环一般格式为:
各个语句的解释参照while循环。
一般执行顺序:首先进入循环,循环体执行完毕后判断表达式的值,表达式成立则再次进入循环。
cd 显示当前目录名或改变当前目录。
rd 删除一个目录。
dir 显示目录中的文件和子目录列表。
tree 以图形显示驱动器或路径的文件夹结构。
path 为可执行文件显示或设置一个搜索路径。
copy 复制文件和目录树。
type 显示文本文件的内容。
copy 将一份或多份文件复制到另一个位置。
del 删除一个或数个文件。
ren 重命名文件。
attrib 显示或更改文件属性。
find 搜索字符串。
fc 比较两个文件或两个文件集并显示它们之间的不同
ping 进行网络连接测试、名称解析
net 网络命令集及用户管理
msg 给用户发送消息
arp 显示、修改局域网的IP地址-物理地址映射列表
at 安排在特定日期和时间运行命令和程序
shutdown立即或定时关机或重启
sc 系统服务设置与控制
reg 注册表控制台工具
powercfg控制系统上的电源设置
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
批处理里面的数值计算功能较弱,只能够进行整型计算,忽略浮点数的小数部分;同时数值计算的范围也受限于系统位数,对于目前较为常见的32位机来说,数值计算能处理的数值范围为0xx7FFFFFFFh,即-~+。
数值计算需要使用set命令,具体格式为“set /a expression”。其中,expression代表计算表达式,计算表达式跟C语言里面的表达式基本上完全一致。set支持的运算符也跟C语言里面的一样,只是没有了増一减一。set支持的运算符及优先级排序如下:
! ~ - - 一元运算符(逻辑非、按位非、取负)
* / % - 算数运算符(乘、除得商、除得余数,即取余)
+ - - 算数运算符(加、减)
& - 按位“与”
^ - 按位“异”
| - 按位“或”
, - 表达式分隔符(set可一次处理多个表达式)
我们知道,批处理中取变量的值是需要用%或者!的,而在set /a 中,直接用变量名称即可取得变量的值。另外,set支持八进制(数字前缀0)、十进制(数字无前缀)和十六进制(数字前缀0x),且支持不同进制之间的计算,如set /a a=123+,计算及显示结果为十进制。
学习有关批处理的一些比较琐碎、但又比较有价值的一些知识,运用这些知识后,才有条件更好的实现的批处理的功能,并能使批处理摆脱黑白世界而显得更加多姿多彩。
所谓“环境变量”,实际上就是C语言里面的“变量”的意思。批处理的变量可以分为两类,由系统定义的系统变量和由用户根据需要自定义的用户变量。
【 1.系统变量 】
批处理的一些变量是由操作系统事先定义好的,可以适用于任何批处理,我们称这些特殊的变量为“系统变量”。系统变量有很多个,包括硬件类、操作系统类、文件路径类、系统时间类等。要查看所有的系统变量,请新打开一个cmd窗口,输入set回车即可。对几个比较常用的变量解释如下:
ComputerName 计算机名,即右键 我的电脑--属性--计算机名 选项卡中的“完整的计算机名称”
Path 可执行文件默认搜索路径。这个东东非常重要!待会儿单独讲解…
Prompt 个性化设置cmd提示符的必备武器!不过,我没怎么用过~
Temp、Tmp 文件、程序等可使用的临时目录,默认是C:\WINDOWS\Temp或Tmp。几乎所有的程序在运行时都会在这个目录里面“临时”写入文件。一般情况下,程序写入的临时文件都应该被该程序删除,可惜的是,大部分的程序都很健忘,导致这个文件夹占据的空间越来越大,自然也就使我们的系统增肥喽。所以,我们要把它修改到其他分区,并且时时的清理里面的临时文件。
UserName 当前用户名,即所登陆的账户名
UserProfile 当前用户的配置目录,一般都是C:\Documents and Settings\%UserName%。默认情况下,我们的桌面就是这个目录下面的“桌面”文件夹;我的文档就是这个目录下面的“My
Documents”文件夹。所以啦,往桌面上或我的文档里面放东西就是放到这个文件夹下面了,也就是放到C盘了,重装系统时要覆盖C盘内容的,所以桌面上或我的文档里面的东西当然就会Gone with the Wind了~解决方法有两个,一是保持良好的习惯,不把重要文件放到这两个地方;二是,修改默认设置,将这两个文件夹都移到其他分区。
编写批处理程序时,用户根据需要自己定义的变量称之为用户变量。用户变量类似于C语言里面的变量,仅仅在定义该变量的程序中有效。
用户变量由set命令定义,这是批处理中非常非常重要的一个操作,从而使set命令成为批处理里面使用频率最高的几个命令之一。关于set命令的使用,参考set /?,本教程也会在后面对其进行讲解。
【 3.变量引用 】
前面的几节课里面,我们已经看到了如何引用变量,即直接用变量名操作变量,通过"%"或"!"来获取变量的值。其中,只有在for语句里面重复对同一变量多次赋值时才需要使用"!",并且在使用"!"调用变量时,要首先“启用延迟环境变量扩充”,启动命令为:SetLocal
:eof,该语句相当于C语言里面的return或汇编语言里面的RET,即子程序返回命令。需要说明的是,当子函数本身就在批处理文件的末尾的话,我们是可以省略这句话的,比如将此例的goto :eof删除是不会产生任何影响的。
【 2.间接传递 】
批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT。
REM 是个注释命令一般是用来给程序加上注解的,该命令后的内容在程序执行的时候将不会被显示和执行。例:
REM 你现在看到的就是注解,这一句将不会被执行。在以后的例子中解释的内容都REM 会放在REM后面。请大家注意。
ECHO 是一个回显命令主要参数有OFF和 ON,一般用ECHO message来显示一个特定的消息 。例:
Rem 以上代表关闭回显即不显示所执行的命令
Echo 这个就是消息。
Rem 以上代表显示“这就是消息”这列字符
GOTO 即为跳转的意思。在批处理中允许以“:XXX”来构建一个标号然后用GOTO :标号直接来执行标号后的命令。例
REM 上面就是名为LABEL的标号。
REM 以上程序跳转标号LABEL处继续执行。
CALL 命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后再继续执行原来的批处理。例:
批处理2.BAT内容如下:
ECHO 这就是2的内容
批处理1.BAT内容如下:
ECHO 这是1的内容
ECHO 1和2的内容全部显示完成
1和2的内容全部显示完成
PAUSE 停止系统命令的执行并显示下面的内容。例:
请按任意键继续 . . .
IF 条件判断语句,语法格式如下:
[NOT] 将返回的结果取反值即“如果没有”的意思。
ERRORLEVEL 是命令执行完成后返回的退出值
Number 退出值的数字取值范围0~255。判断时值的排列顺序应该又大到小。返回的值大于或等于指定的值时条件成立。
string1==string2 string1和string2都为字符的数据,英文字符的大小写将看做不同,这个条件中的等于号必须是2个(绝对相等),条件相等后即执行后面的 command
IF ERRORLEVEL这条语句必须放在某一个命令后面。执行命令后由IF ERRORLEVEL来判断命令的返回值。
启动批处理文件中环境变量的本地化。
结束某一进程。常用的有以下两种用法:
结束已知应用名称的某一进程
结束已知进程码的某一进程
进程码可以通过任务管理器查询,或者通过 cmd 运行 tasklist 获取。
参数 -t 表示结束该进程,-f 表示强制结束该进程及所有子进程。
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号) 如果有指定的文件,则条件成立,运行命令,否则运行下一句。 如果程序返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。(返回值必须按照从大到小的顺序排列)
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),称为错误码errorlevel或称返回码。 常见的返回码为0、1。通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。
语法: if 条件 (成立时执行的命令) else (不成立时执行的命令)
如果是多个条件,建议适当使用括号把各条件包起来,以免出错。
注:如果 else 的语句需要换行,if 执行的行尾需用“^”连接,并且 if 执行的动作需用(括起来),否则报错
choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的 errorlevel,
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。
使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
%variable 指定一个单一字母可替换的参数。变量名称是区分大小写的,所以 %i 不同于 %I
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持
如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配。
检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。
如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
该集表示以增量形式从开始到结束的一个数字序列。
eol=c - 指一个行注释字符的结尾(就一个,如“;”)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。
m-n格式为一个范围。通过 nth 符号指定 mth。
如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。
1. 如下命令行会显示当前目录下所有以bat或者txt为扩展名的文件名。
a. 如下命令行会显示当前目录下所有包含有 e 或者 i 的目录名。
b. 如下命令行会显示 E盘test目录 下所有以bat或者txt为扩展名的文件名。
c. 如下命令行将产生序列
d. 以下两句,显示当前的年月日和时间
e. 把记事本中的内容每一行前面去掉8个字符
:: 读取记事本里的内容(使用 delims 是为了把一行显示全,否则会以空格为分隔符)
continue: 在 for 循环的最后一行写上一个标签,跳转到这位置即可 break: 在 for 循环的外面的下一句写上一个标签,跳转到这位置即可
测试网络联接状况以及信息包发送和接收状况。但是不能够测试端口。
-t 不停地向目标主机发送数据;
-a 以IP地址格式来显示目标主机的网络地址;
-l size 指定发送到目标主机的数据包的大小。
测试端口使用 telnet IP地址或主机名 端口,使用tcp协议的
b 是指定背景色的十六进制数字; f 指定前景颜色(即字体颜色)。 如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。 如果两参数一样,视为无效输入。只有一个参数时,设置字体。
产生随机数(正整数0~)
结束程序。即时是被调用的程序,结束后也不会返回原程序
%源字符串:~起始值,截取长度% (起始值从0开始;截取长度是可选的,如果省略逗号和截取长度,将会从起始值截取到结尾;
截取长度如果是负数,表示截取到倒数第几个。)
"%time:~0,5%" 显示"hh:mm"(即"11:04"),其中0表示从右向左移位操作的个数,5表示从左向右移位操作的个数
上面的字串分割格式,也可以用于其它地方,如目录路径:"%cd:~0,10%"
由于没有直接的字符串合并函数,只能用笨方法了。
没有现成的函数。如下程序利用 goto形成循环,不断将字符串截短1,并记录截短的次数,到字符串变成空时的次数即长度。
:: 判断str是不是空,如果不是则执行下边的语句
:: 算术运算,使num的值自增1,相当于num++或者++num语句
:: 截取字符串,每次截短1
:: 跳转到next1标签: 这里利用goto和标签,构成循环结构
:: 当以上循环结构执行完毕时,会执行下边的语句
复制C的所有txt文件到D
所有gif扩展名改为jpg扩展名
提取当前目录下扩展名为mp3的文件名,输出到mp3文件名.txt
输出文件的绝对路径信息