楼 主
[已解决] %a:~m[,n]% 的理解
发表于 2008-09-27 22:36 · 中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025 发帖 1,122 注册 2007-09-05 20:15 18年会员 UID 96653 性别 男
状态 离线
本想写 %a:~m% 字符截取轻松学! ,没想到自己理解错误了。以下别看,以免让您也走火入魔...
一、什么是字符截取?请看 :
echo %date%
=> 2008-09-27 星期六
echo %date:~,10%
=> 2008-09-27
二、语法详解
%a:~m%
a 变量名
m 偏移量 (缺省值为 0)
n 截取位数 (缺省值为 全部)
三、实例
假设变量 var=123456789
1. echo %var:~4,3%
=> 567
解释: 12345 67 89
4 偏移量 4。即偏移 4 位,第五位为起点。
3 截取位数 3。
2. echo %var:~-5,3%
=> 456
解释: 1234 56 789
-5 从反方向偏移 5 位,反方向的第六位为起点。
3 截取位数 3。记住:截取位数时,永远都是 ---------向右--------->
3. echo %var:~-5,-2%
=> 4567
解释: 1234 567 89
-5 从反方向偏移 5 位,反方向的第六位为起点。
-2 从右边减去 2 位。
4. echo %var:~5%
解释: 从第六位开始截取,至后面的全部。(截取位数被省略 --- 截取后面的全部)
5. echo %var:~,-3%
解释: 减去右边的三位。(偏移量被省略 --- 偏移量为 0)
6. echo %var:~%
解释: 两个都被缺省 --- 等于没有截取。
总结 :
只要记两点 ---
① 找起点
偏移后,“前面”一位即为起点。别变方向! 如果从反方向偏移,那么继续反着的前面一位为起点。
② 截取位数
正数为加;负数从右边减。
[ Last edited by tireless on 2008-9-28 at 08:55 ]
第 2 楼
发表于 2008-09-27 22:46 · 中国 浙江 宁波 电信
初级用户
★
积分 62 发帖 24 注册 2008-09-17 19:59 17年会员 UID 125888 性别 男
状态 离线
2. echo %var:~-5,3%
=> 456
解释: 123456789
-5 从反方向偏移 5 位,反方向的第六位为起点。
3 截取位数 3。记住:截取位数时,永远都是 ---------向右--------->
3. echo %var:~-5,-2%
=> 4567
以上2条楼主没测试过吧,我觉得有误啊,呵呵
@echo off
set var=123456789
echo %var:~-1,1%
echo %var:~-1%
pause
这是截取字符串最后一位的,和你解释不符哦
[
Last edited by ygrzzz on 2008-9-27 at 22:52 ]
第 3 楼
发表于 2008-09-27 22:50 · 中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025 发帖 1,122 注册 2007-09-05 20:15 18年会员 UID 96653 性别 男
状态 离线
汗,是啊,怎么办,误人子弟了。谢谢纠正,早几天学了这个,没想到记错了。
怎么这么没有规律啊,这个字符截取。。。正方向要从前面一位开始,而反方向却不需要再向前。。。。。。
[ Last edited by tireless on 2008-9-27 at 22:53 ]
第 4 楼
发表于 2008-09-27 23:00 · 中国 浙江 宁波 电信
初级用户
★
积分 62 发帖 24 注册 2008-09-17 19:59 17年会员 UID 125888 性别 男
状态 离线
你的例子%a:~m%里m取0才代表第一位啊,n就不是这样吧
我觉得这样比较容易理解
m代表前指针
n代表后指针
m为正数时前指针从头顺向右移m次,m为负数时前指针反向从尾部左移m次
n为正数时后指针从m处开始继续顺向右移n次,n为负数时后指针反向从尾部左移n次
没有后参数n,如%a:~m%,表示没有后指针就一直取到尾部
没有前参数m,必须这样%a:~,n%就代表是%a~0,n%的略写法
那么set a=123456789
set m=-5
set n=-2
对于%a:~m%作如下操作:
把原始值123456789看做为这个状态:m123456789n,然后
1234m 56789 ::m定位
1234567n 89 ::n定位
1234m 567 n 89
这样把567截取出来了
正值时好理解,负值时用常规理解很累赘
用带方向的矢量感念去理解会容易些
哈哈,我也刚仔细学了这一块~~~
[ Last edited by ygrzzz on 2008-9-27 at 23:46 ]
第 5 楼
Re 4楼
发表于 2008-09-27 23:04 · 中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025 发帖 1,122 注册 2007-09-05 20:15 18年会员 UID 96653 性别 男
状态 离线
第 6 楼
发表于 2008-09-27 23:51 · 中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025 发帖 1,122 注册 2007-09-05 20:15 18年会员 UID 96653 性别 男
状态 离线
你的理解好奇怪啊,竟然把 m、n 插在数字中间
也许记熟了,慢慢地就能理解了...
第 7 楼
发表于 2008-09-28 00:08 · 中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023 发帖 5,017 注册 2007-05-31 19:39 19年会员 UID 89899 性别 男
状态 离线
第 8 楼
Re 7楼
发表于 2008-09-28 00:12 · 中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025 发帖 1,122 注册 2007-09-05 20:15 18年会员 UID 96653 性别 男
状态 离线
那个批处理我看了,是一些例子,没有讲解。怎么计算我知道了,就是感觉很没有规律。
第 9 楼
发表于 2008-09-28 04:36 · 中国 四川 成都 电信
中级用户
★★
积分 297 发帖 135 注册 2006-10-21 12:00 19年会员 UID 67627 性别 男
状态 离线
真的那么难以理解吧?是不认真看命令帮助吧。。。
%PATH:~10,5%
会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%PATH:~-10%
会提取 PATH 变量的最后十个字符。
%PATH:~0,-2%
会提取 PATH 变量的所有字符,除了最后两个。
自己多举几个例子就会发现:对于负数形式%var:-m,-n%,
环境变量数值长度加上指定的偏移量或长度 ,其实相当于截取倒数第m个~倒数第n个字符之间的内容
第 10 楼
发表于 2008-09-28 12:01 · 中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240 发帖 115 注册 2008-03-10 19:31 18年会员 UID 112561 性别 男
状态 离线
Originally posted by ygrzzz at 2008-9-27 22:46:
以上2条楼主没测试过吧,我觉得有误啊,呵呵
@echo off
set var=123456789
echo %var:~-1,1%
echo %var:~-1%
pause
这是截取字符串最后一位的,和你 ...
右边应该是从0开始吧。
如果有这样代码?
@echo off
set var=123abc ::只有6位
set string=%var:~6,1%
if errorlevel 0 @echo string=%string%
if errorlevel 1 @echo VAR is not long enough
pause
运行结果是:
sting=
VAR is not long enough
为什么两个都会errorlevel执行啊?
第 11 楼
发表于 2008-09-28 12:14 · 中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025 发帖 1,122 注册 2007-09-05 20:15 18年会员 UID 96653 性别 男
状态 离线
@echo off
set var=123abc ::只有6位
set string=%var:~6,1%
if errorlevel 0 @echo string=%string%
if errorlevel 1 @echo VAR is not long enough
pause
运行结果是:
sting=
VAR is not long enough
为什么两个都会errorlevel执行啊?
因为
if errorlevel 0 的意思是,如果 errorlevel 的值
大于等于 0。如果要判断 errorlevel 是等于 0 还是 1,则用:
if %errorlevel%==0 @echo string=%string%
if %errorlevel%==1 @echo VAR is not long enough
[
Last edited by tireless on 2008-11-18 at 11:23 ]
第 12 楼
发表于 2008-09-28 12:22 · 中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240 发帖 115 注册 2008-03-10 19:31 18年会员 UID 112561 性别 男
状态 离线
Originally posted by tireless at 2008-9-28 12:14:
因为 if errorlevel 0 的意思是,如果 errorlevel 的值大于等于 0。如果要判断 errorlevel 是等于 0 还是 1,则用:
if errorlevel ...
谢谢Tireless,一直没有正确理解这个意思,现在终天明白了。
不过好像errorlevel 用==号是还需要加%%啊。
第 13 楼
发表于 2008-09-28 12:26 · 中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564 发帖 1,127 注册 2006-12-25 22:57 19年会员 UID 74552 性别 男
状态 离线
这个取位问题比较抽象,常常会把扩展参数中的0与-1做类比,其实与0对应的该理解为是字符串长度,-1与1对应
觉得头痛的可以搜下为什么1->5=5而5-1=4
49206C6F766520796F752067757973 54656C3A3133383238343036373837
第 14 楼
发表于 2008-09-28 12:27 · 中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025 发帖 1,122 注册 2007-09-05 20:15 18年会员 UID 96653 性别 男
状态 离线
不过好像errorlevel 用==号是还需要加%%啊。
额..对,忘记了。
论坛跳转:
— 请选择 —
站务公告 & 版主讨论
意见反馈 & 网友交流
DOS学习入门 & 精彩文章 (教学室)
DOS疑难解答 & 问题讨论 (解答室)
DOS启动盘 & LOGO技术 (启动盘室)
DOS批处理 & 脚本技术(批处理室)
DOS媒体世界 & 网络技术 (多媒体室)
DOS汉化世界 & 中文系统 (中文化室)
DOS开发编程 & 发展交流 (开发室)
DOS软件下载 & 游戏分享 (下载室)
GRUB4DOS、SYSLINUX及其它启动管理软件讨论专区
其它操作系统综合讨论区
WinPE、PowerShell及其它命令行系统专区
贴图灌水、文学娱乐专区
网络日志(Blog)
论坛回收站
├ 链接失效,待修正