DOS批处理字符串截取
作者:扬科网络
【字符串截取语法格式】
% VAR:~ [ m [ ,n ] ] %
或者
!VAR: ~ [ m [,n ] ] !
- [ ] (方括号)表示可选
- 两边的 %(或 ! )为变量取值标识符
- VAR 为变量名(不可缺少)
- 符号 : 用于分隔变量名和说明部分
- 符号 ~ 可以简单理解为“偏移”
- m 为 %VAR% 或 !VAR]! 中的字符偏移,如果从右向左,则字符的偏移从 0 始计数,即:其第一个字符的偏移是0;如果从左向右,则字符的偏移从 -1 开始计数,即:其最后一个字符的偏移是 -1),m 的缺省值为0。
- n 为将要截取字符串的长度,n 的缺省值为 0
【语法功能】
从变量值中截取字符(串)
【关于 m 的取值】
m 的取值可以是取正整数,也可以是负整数,下面举例说明:
set "a=abcdefg"
在 %a:~m,n% 中,m的取值范围如下所示:
- 如果 m 的值大于取值范围的最大值时,则截取不到任何字符
- 如果 m 的值小于取值范围的最小值时,则 m 取值为最小值
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off set "a=abcdef" echo 截取前的值: "%a%" :: -7 小于 取值范围最小值 -6,则m取值-6 set var=%a:~-7,2% echo 截取后的值: "%var%" echo --------------------------------------------------- set "a=abcdef" echo 截取前的值: "%a%" :: 6 大于 取值范围最大值 5,则截取不到任何字符 set var=%a:~6,2% echo 截取后的值: "%var%"
运行
C:\>demo
截取前的值: "abcdef"
截取后的值: "ab"
---------------------------------------------------
截取前的值: "abcdef"
截取后的值: ""
C:\>
【关于 n 的取值】
n 的取值可以是取正整数,也可以是负整数,下面举例说明:
1、在 %a:~m,n% 中,n 为正整数,则在 %a% 中,从偏移是 m 的字符(包括偏移是 m 的字符)开始,截取长度为 n 的所有字符。
C:\>set a=abcdefg C:\>echo %a:~1,3% bcd C:\>
在 %a:~m,n% 中,n 为正整数,如果截取的长度超出 %a% 中的长度,则截取至 %a% 的末尾字符(包括末尾字符)。
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off set "a=abcdef" echo 截取前的值: "%a%" :: 8 超出 %a% 的字符最大偏移(5),则截取到末尾 set var=%a:~1,8% echo 截取后的值: "%var%"
运行
C:\>demo
截取前的值: "abcdef"
截取后的值: "bcdef"
C:\>
2、在 %a:~m,n% 中,如果 n 为负整数,则先除掉 %a% 末尾的 -n 个字符的,再进行截取操作:截取从偏移是 m 的字符(包括偏移是 m 的字符)开始,直到被截取原字符串的末尾字符(包括末尾字符)为止。
C:\>set a=abcdefg C:\>echo %a:~0,-3% abcd C:\>
“ %VAR:~ [ m [ ,n ] ]% ” 中,当 n 是负整数,但该负整数的绝对值超出 %VAR% 的字符个数时,则截取不到任何字符。
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off set "a=abcdef" echo 截取前的值: "%a%" :: n的绝对值超出 %a% 的字符个数 set var=%a:~-1,-7% echo 截取后的值: "%var%"
运行
C:\>demo
截取前的值: "abcdef"
截取后的值: ""
C:\>
【关于被截取变量的值】
“ %VAR:~ [ m [ ,n ] ]% ” 中,字符串截取操作发生后,VAR 的值不会改变
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off set "a=abcdef" echo 截取前的值: "%a%" :: 从%a%第二个字符(其偏移为1)开始,截取2个字符 set var=%a:~1,2% echo 截取后的值: "%var%" :: 截取操作发生后,a的值不会改变 echo a的值: "%a%"
【标注一】 下载Notepad++
运行
C:\>demo
截取前的值: "abcdef"
截取后的值: "bc"
a的值: "abcdef"
C:\>
【关于缺省值】
1、“ %VAR:~ [ m [ ,n ] ]% ” 中,n 的缺省值为 0
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off set "a=abcdef" echo 截取前的值: "%a%" :: 从%a%第二个字符(其偏移为1)开始,截取 0 (n的缺省值是0)个字符 set var=%a:~1,% echo 截取后的值: "%var%"
运行
C:\>demo
截取前的值: "abcdef"
截取后的值: ""
C:\>
2、“ %VAR:~ [ m [ ,n ] ]% ” 中,m 的缺省值为 0
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off set "a=abcdef" echo 截取前的值: "%a%" :: 从%a%的第一个字符(m的缺省值是0)开始,截取2个字符 set var=%a:~,2% echo 截取后的值: "%var%"
运行
C:\>demo
截取前的值: "abcdef"
截取后的值: "ab"
C:\>
3、“ %VAR:~ [ m [ ,n ] ]% ” 中, n 和 ,(逗号)都缺省时,则 n 的值为:从偏移是 m 的字符(包括该字符)到结尾字符(包括该字符)的所有字符的个数
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off set "a=abcdef" echo 截取前的值: "%a%" :: 从%a%的第二个字符(m的缺省值是0)开始,截取到结尾的所有字符 set var=%a:~1% echo 截取后的值: "%var%"
运行
C:\>demo
截取前的值: "abcdef"
截取后的值: "bcdef"
C:\>
【在变量延迟展开中使用字符串截取】
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off setlocal enableDelayedExpansion set "a=abcdef" echo 截取前的值: "!a!" :: 从 !a! 的第二个字符,截取长度为 2 的所有字符 set var=!a:~1,2! echo 截取后的值: "%var%"
运行
C:\>demo
截取前的值: "abcdef"
截取后的值: "bc"
C:\>
【注意】
字符串的截取操作在引用变量的地方均可以,并不一定必须要有set命令
示例
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】 ::demo.bat @echo off setlocal enableDelayedExpansion set "a=abcdef" echo 截取前的值: "!a!" ::使用echo命令直接输出截取的字符串 :: 从 !a! 的第二个字符,截取长度为 2 的所有字符 echo 截取的字符串: !a:~1,2!
运行
C:\>demo
截取前的值: "abcdef"
截取的字符串: bc
C:\>
到此这篇关于DOS批处理字符串截取的文章就介绍到这了,更多相关批处理字符串截取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!