中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
作者:
标题: [已解决] %a:~m[,n]% 的理解 上一主题 | 下一主题
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『楼 主』:  [已解决] %a:~m[,n]% 的理解

本想写 [学习心得]%a:~m[,n]% 字符截取轻松学!,没想到自己理解错误了。以下别看,以免让您也走火入魔... 一、什么是字符截取?请看 echo %date% => 2008-09-27 星期六 echo %date:~,10% => 2008-09-27 二、语法详解 %a:~m[,n]% a 变量名 m 偏移量 (缺省值为 0) n 截取位数 (缺省值为 全部) 三、实例 假设变量 var=123456789 1. echo %var:~4,3% => 567 解释: 123456789 4 偏移量 4。即偏移 4 位,第五位为起点。 3 截取位数 3。 2. echo %var:~-5,3% => 456 解释: 123456789 -5 从反方向偏移 5 位,反方向的第六位为起点。 3 截取位数 3。记住:截取位数时,永远都是 ---------向右---------> 3. echo %var:~-5,-2% => 4567 解释: 123456789 -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 ]


2008-9-27 22:36
查看资料  发短消息  网志   编辑帖子  回复  引用回复
ygrzzz
初级用户





积分 62
发帖 24
注册 2008-9-17
状态 离线
『第 2 楼』:  

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 ]


   此帖被 +1 点积分     点击查看详情   
评分人:【 tireless 分数: +1  时间:2008-9-27 22:49


2008-9-27 22:46
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 3 楼』:  

汗,是啊,怎么办,误人子弟了。谢谢纠正,早几天学了这个,没想到记错了。 怎么这么没有规律啊,这个字符截取。。。正方向要从前面一位开始,而反方向却不需要再向前。。。。。。 [ Last edited by tireless on 2008-9-27 at 22:53 ]


2008-9-27 22:50
查看资料  发短消息  网志   编辑帖子  回复  引用回复
ygrzzz
初级用户





积分 62
发帖 24
注册 2008-9-17
状态 离线
『第 4 楼』:  

你的例子%a:~m[,n]%里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[,n]%作如下操作: 把原始值123456789看做为这个状态:m123456789n,然后 1234m56789 ::m定位 1234567n89 ::n定位 1234m567n89 这样把567截取出来了 正值时好理解,负值时用常规理解很累赘 用带方向的矢量感念去理解会容易些 哈哈,我也刚仔细学了这一块~~~ [ Last edited by ygrzzz on 2008-9-27 at 23:46 ]


2008-9-27 23:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 5 楼』:  Re 4楼

要不你在这里给我解释下吧,看能否更好理解。谢谢


2008-9-27 23:04
查看资料  发短消息  网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 6 楼』:  

你的理解好奇怪啊,竟然把 m、n 插在数字中间 也许记熟了,慢慢地就能理解了...


2008-9-27 23:51
查看资料  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 7 楼』:  

理解变量字符的截取功能 www.cn-dos.net/forum ...




2008-9-28 00:08
查看资料  发短消息  网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 8 楼』:  Re 7楼

那个批处理我看了,是一些例子,没有讲解。怎么计算我知道了,就是感觉很没有规律。


2008-9-28 00:12
查看资料  发短消息  网志   编辑帖子  回复  引用回复
zqz0012005
中级用户




积分 297
发帖 135
注册 2006-10-21
状态 离线
『第 9 楼』:  

真的那么难以理解吧?是不认真看命令帮助吧。。。
%PATH:~10,5% 会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏 移量 10)字符开始的五个字符。如果没有指定长度,则采用默认 值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数, 使用的数字则是环境变量数值长度加上指定的偏移量或长度。 %PATH:~-10% 会提取 PATH 变量的最后十个字符。 %PATH:~0,-2% 会提取 PATH 变量的所有字符,除了最后两个。
自己多举几个例子就会发现:对于负数形式%var:-m,-n%,环境变量数值长度加上指定的偏移量或长度,其实相当于截取倒数第m个~倒数第n个字符之间的内容


   此帖被 +4 点积分      点击查看详情   
评分人:【 tireless 分数: +2  时间:2008-9-28 12:32
评分人:【 516526966 分数: +2  时间:2008-10-27 03:22




2008-9-28 04:36
查看资料  发短消息  网志  OICQ (411976538)  编辑帖子  回复  引用回复
terrytong
中级用户





积分 240
发帖 115
注册 2008-3-10
状态 离线
『第 10 楼』:  

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执行啊?


2008-9-28 12:01
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 11 楼』:  

@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 ]


2008-9-28 12:14
查看资料  发短消息  网志   编辑帖子  回复  引用回复
terrytong
中级用户





积分 240
发帖 115
注册 2008-3-10
状态 离线
『第 12 楼』:  

Originally posted by tireless at 2008-9-28 12:14: 因为 if errorlevel 0 的意思是,如果 errorlevel 的值大于等于 0。如果要判断 errorlevel 是等于 0 还是 1,则用: if errorlevel ...
谢谢Tireless,一直没有正确理解这个意思,现在终天明白了。 不过好像errorlevel 用==号是还需要加%%啊。


2008-9-28 12:22
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 13 楼』:  

这个取位问题比较抽象,常常会把扩展参数中的0与-1做类比,其实与0对应的该理解为是字符串长度,-1与1对应 觉得头痛的可以搜下为什么1->5=5而5-1=4




49206C6F766520796F752067757973 54656C3A3133383238343036373837
2008-9-28 12:26
查看资料  发短消息  网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 14 楼』:  

不过好像errorlevel 用==号是还需要加%%啊。
额..对,忘记了。


2008-9-28 12:27
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: