bat总结12 字符串的处理:截取,替换,合并等等,与echo set 相关

参考文档

https://blog.csdn.net/u013514928/article/details/79630020

  Windows批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集。批处理中可实现的字符串处理功能有:截取字符串内容、替换字符串特定字段、合并字符串、扩充字符串等功能。下面对这些功能一一进行讲解。、

31 set
设置变量
引用变量可在变量名前后加 % ,即 %变量名%
set #显示目前所有可用的变量,包括系统变量和自定义的变量
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
echo %p:~0,3% #显示前3个字符,即aa1
echo %p:~-2% #显示最后面的2个字符,即b2
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
set /a p=39 #设置p为数值型变量,值为39
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
set p= #取消p变量
set /p p=请输入
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
注意这条可以用来取代 choice 命令
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
@echo off
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo %p%
)
结果将显示
aaa
aaa
因为在读取 if 语句时已经将所有 %p% 替换为aaa
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo !p!
)
ENDLOCAL
结果将显示
aaa
bbb
还有几个动态变量,运行 set 看不到
%CD% #代表当前目录的字符串
%DATE% #当前日期
%TIME% #当前时间
%RANDOM% #随机整数,介于0~32767
%ERRORLEVEL% #当前 ERRORLEVEL 值
%CMDEXTVERSION% #当前命令处理器扩展名版本号
%CMDCMDLINE% #调用命令处理器的原始命令行
可以用echo命令查看每个变量值,如 echo %time%
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到

1.截取字符串

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

=========================================

   @echo off

   set ifo=abcdefghijklmnopqrstuvwxyz0 12 3456789

   echo 原字符串(第二行为各字符的序号):

   echo %ifo%

   echo 1234567890 123 45678901234567890123456

   echo 截取前5个字符:

   echo %ifo:~0,5%

   echo 截取最后5个字符:

   echo %ifo:~-5%

   echo 截取第一个到倒数第6个字符:

   echo %ifo:~0,-5%

   echo 从第4个字符开始,截取5个字符:

   echo %ifo:~3,5%

   echo 从倒数第14个字符开始,截取5个字符:

   echo %ifo:~-14,5%

   pause

   =========================================

   当然,上面的例子只是将字符串处理的基本功能展示出来了,还看不出字符串处理具体有什么用处。下面这个例子是对时间进行处理。

   =========================================

   @echo off

   echo 当前时间是:%time% 即 %time:~0,2%点%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒

   pause

   =========================================

2.替换字符串

  替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串。举例说明其功能:

  =========================================

  @echo off

  set aa=伟大的中国!我为你自豪!

  echo 替换前:%aa%

  echo 替换后:%aa:中国=中华人民共和国%

  echo aa = %aa%

  set "aa=%aa:中国=中华人民共和国%"

  echo aa = %aa%

  pause

  =========================================

  对于上面的例子有一点说明,对比两个echo aa = %aa%可以发现,如果要修改变量aa的内容的话,就需要将修改结果“%aa:中国=中华人民共和国%”赋值给变量aa。上面的字符串截取也有着同样的特点。

3.字符串合并

  其实,合并字符串就是将两个字符串放在一起就可以了。举例说明:

   @echo off
    rem 合并字符串变量
  set aa=伟大的中国!
  set bb=我为你自豪!
  echo %aa%%bb%
  echo aa=%aa%
  echo bb=%bb%
  set "aa=%aa%%bb%"
  echo aa=%aa%
    rem 合并字符串常量123和abc
    echo 123abc    
    rem 合并字符串常量和变量
    echo acb%aa% 
  pause

 同样,如果要改变变量aa的内容的话,就需要将合并结果“%aa%%bb%”赋值给变量aa。

4.扩充字符串

  “扩充”这个词汇来自于微软自己的翻译,意思就是对表示文件路径的字符串进行特殊的处理,具体功能罗列如下:

  =========================================

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

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

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

  %~pI - 仅将 %I 扩充到一个路径

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

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

  %~sI - 扩充的路径只含有短名

  %~aI - 将 %I 扩充到文件的文件属性

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

  %~zI - 将 %I 扩充到文件的大小

  %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串可以组合修饰符来得到多重结果:

   %~dpI - 仅将 %I 扩充到一个驱动器号和路径

   %~nxI - 仅将 %I 扩充到一个文件名和扩展名

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

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

   %~ftzaI - 将 %I 扩充到类似输出线路的 DIR

   =========================================

   以上内容引用于for /?帮助信息。其中的I代表变量I,不过需要说明的是,不是所有的变量都能够进行扩充的,有两个条件:1.该字符串代表一个文件路径;2.变量要用%x来表示,x可取a-z A-Z 0-9共62个字符中的任意一个。举例说明:

   =========================================

   @echo off

   echo 正在运行的这个批处理:

   echo 完全路径:%0

   echo 去掉引号:%~0

   echo 所在分区:%~d0

   echo 所处路径:%~p0

   echo 文件名:%~n0

   echo 扩展名:%~x0

   echo 文件属性:%~a0

   echo 修改时间:%~t0

   echo 文件大小:%~z0

   pause

   =========================================

   其中的%0是批处理里面的参数,代表当前运行的批处理的完全路径。类似的还有%1-%9,分别代表传递来的第1-9个参数。例子如下:

   ===============================================

   @echo off

   set aa=C:\Windows\PPP\a.btx

   call :deal aaa %aa% "c c" ddd eee

   pause>nul

   exit

   :deal

   echo %%0 = %0

   echo %%1 = %1

   echo %%2 = %2

   echo %%3 = %3

   echo %%4 = %4

   echo %%5 = %5

   ===============================================

   其中,变量aa在之前是不可以扩充的,通过call命令并将aa作为参数传递给子函数:deal,将aa变量转换成了变量%1,即符合%x格式,从而可以进行字符串扩充。

   至于%x中x取a-z A-Z的形式,可以复习一下for语句,for语句里面的变量就是用%x来表示的,因而可以直接进行扩充。

猜你喜欢

转载自blog.csdn.net/xuemanqianshan/article/details/88255985
今日推荐