[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 dosbat 于 2011-4-17 13:28 编辑

set str=123456789
set var=%str:~数值i,数值j%
~数值i:当i>=0时,表示跳过前面的i个字符;
         当i<0时,表示跳过前面(n-i)个字符,其中n为字符串长度,换言之,即保留最后i个字符
例如:当我想截取str的第4个字符开始的3个字符时,要跳过前面3个字符,故数值i=3,又因为长度为3,故数值j=3,写成批处理语句为:set var=%str:~3,3% 也可以写成 set var=%str:~-6,3%
不知道我说清楚没有 欢迎批评指正

TOP

好顶必回。。。。

TOP

多谢,我学到了很多东西
nothing's gonna change
and I've never changed

TOP

本帖最后由 秋风·飞扬 于 2012-5-12 18:22 编辑

总结,① 当只有一个参数存在的时候,系统会默认当它为偏移量。 (set str=%str:~nn%)
         此时,若nn为正,那么就偏移nn个取后面的。
         此时,若nn为负,那么就从后面往前偏移nn个位置,开始往后取(也就是说后面nn个全部被取到了)。

      ② 0就是空,空就是0。  (set s=%str:~mm,%)   
     
      ③ 长度为零就不取了呗。 (set s=%str:~mm,%)        

      ④ 偏移量为正的时候     (set s=%str:~mm,nn%)
        如果nn为正,那么就偏移mm个位置后,取后面nn个字符。
        如果nn为负,那么就偏移mm个位置后,在从后面去掉nn个字符,取中间的。
        
      ⑤ 偏移量为零的时候     (set s=%str:~0,nn%)
         如果nn为正,那么就不偏移,直接去nn个。
         如果nn为负,那么就不偏移,从头取,但除了后nn个。   
      
      ⑥ 偏移量为负的时候     (set s=%str:~-mm,nn%)
         如果nn为正,那么就从尾巴开始往前偏移mm个位置后,开始回头取字符,个数为nn个。
         如果nn为负,那么就从尾巴开始往前偏移mm个位置后,开始回头取字符,但是要排除掉后面的nn个字符。

TOP

本帖最后由 cjiabing 于 2012-5-15 00:39 编辑

格式:%str:~m,n%
str表示字符串变量,是一个从左至右的单向坐标轴,用位数表示单位,用横杠“-”表示反方向。
m表示指定位数、定位,从字符串的哪个位数开始提取;负的表示从后面第几位开始提取。
n表示指定个数,提取多少个字符;负的表示去掉后面多少个字符。
举例:
set str=我爱北京天安门
“我爱北京天安门”一共是7个字符;

字符  顺序 偏移量
-------------------------
我     1       0
爱     2       1
北     3       2
京     4       3
天     5       4
安     6       5
门     7       6

顺数的时候偏移量向后一位,也就是将位数减去1得到偏移量。比如第三位是“北”,偏移量就是3-1=2,提取时写成%str:~2,1%。

1、echo %str:~0,7%
表示从第1位开始提取,7表示提取7个字符串,显示“我爱北京天安门”。
2、echo %str:~0,3%
表示从第1位开始提取,一共提取3个,结果是“我爱北”。
3、echo %str:~4,3%
表示从第5位开始提取,一共提取三位,结果“天安门”。
4、echo %str:~0,-3%
表示从1位开始提取,排除掉、去掉最后3位,结果是“我爱北京”。
5、echo %str:~-3,3%
表示从倒数第3位开始提取,一共提取3位,结果是“天安门”。
6、echo %str:~-5,-2%
表示从倒数第5位开始提取,排除最后两位,提取两者中间的字符,结果是“北京天”。
从后面往前面数第5位是“北”,最后两位是“安门”,中间的就是“北京天”。


实在无聊在此乱打,随便看罢!如果要口诀可以这样:
左位右数——表示左边m是定位,右边n是定数;
左位负倒——表示左位是负“-”时从后面数起;
右数负除——表示右位是负“-”时除掉后面的位数。
因此:
正时:左定位数,右定个数
负时:左边从后数起,右边去掉后位
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

好帖必顶不解释!楼主辛苦了,学到了很多——刚好用上了。

TOP

本帖最后由 stance 于 2012-11-28 17:09 编辑

感谢好贴!建议改进机器语言到自然语言的转换:
  提取最后的3个字符:set var=%str:~-3%(提取从后往前数,自倒数第3个字符开始往后的连续字符:set var=%str:~-3%)
  提取倒数第2个及其之前的3个字符:set var=%str:~-5,4%(提取从后往前数,自倒数第5个字符开始往后的4个连续字符:set var=%str:~-5,4%)
  提取除了最后4个字符的字符串:set var=%str:~0,-4%(提取从前往后数,自第0个至倒数第4个字符之间的连续字符:set var=%str:~0,-4%)

莫怪吹毛求疵,只是希望便于理解。

TOP

感谢,这个很值得学习的!

TOP

字符截取的一般形式:set var=%str:~数值x,数值y%,总共4种情况:x>=0,y>=0;x>=0,y<0从;x<0,y>=0;x<0,y<0;还有一种情况只存在一个数值,较简单。

TOP

每天进步一点,谢谢分享。

TOP

取偶数位,是否正确?
ECHO OFF
set var=1234567890
for /a %%i in (1,2,9) do (echo %var:~%%i,1%)
pause

TOP

36楼输出的是23

TOP

回复 58# suseek


    不正确,你亲自测试一下就知道了。

TOP

谢谢指正
ECHO OFF
setlocal enabledelayedexpansion
set var=1234567890
for /l %%i in (1,2,9) do (

echo !var:~%%i,1!
)






)


pause

TOP

多谢!!!感谢大神!

TOP

返回列表