中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: for 里面的一个现象 上一主题 | 下一主题
rs369007
初级用户





积分 147
发帖 131
注册 2008-9-22
状态 离线
『楼 主』:  for 里面的一个现象

@echo off & setlocal enabledelayedexpansion
for /f "tokens=2 delims=:" %%c in ('ipconfig/all ^|find "DNS Servers"') do (
        set DNSservers=%%c
        echo !DNSservers!+
        echo +!DNSservers!
        echo !DNSservers:~1!+
        echo +!DNSservers:~1!       
        )

pause

-------------------------------------------
运行结果:

+218.6.132.39           ‘+’ 将空格占了
+ 218.6.132.39     
+18.6.132.39             ‘+‘将2给占了
        32.39           ?



  freedom!
2010-5-2 16:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 2 楼』:  

问题在于ipconfig
在它的输出文本中
每行末尾都会多一个回车符(\r,CR,0x0d)
也就是它的每行行尾都是\r\r\n
多出来的\r被for/f提取到并存储到变量中
而你的例子
因为没有将空格设为delims
所以IP前的空格也被存到变量中
所以变量DNSservers的值为
<空格>218.6.132.39<回车>

而Echo变量的时候
回车符的作用是使光标回到本行行首
所以才会出现+把空格或者其它行首字符挤占的情况
如果你把加号换成其它多字符的字符串
就会发现有更多的IP字符被后面的字符串覆盖

参考:
[50条]不能说的秘密-CMD命令奇诡语法特性汇集
http://www.cn-dos.net/forum/viewthread.php?tid=50912

[ Last edited by qzwqzw on 2010-5-2 at 17:19 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 rs369007 分数: +2  时间:2010-5-2 17:25


2010-5-2 17:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





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

Vista、Win7系统没有这个问题



2010-5-2 18:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
rs369007
初级用户





积分 147
发帖 131
注册 2008-9-22
状态 离线
『第 4 楼』:  

刚在c里面测试确实如此
char carriage[]={'p','i','n','g','\r','\0'};

fprintf(stdout,"%s",carriage);

编译成test.exe

test&echo in

运行结果是:inng

将ipconfig/all 保存在文本,但是我用fscanf读不到这个‘\r',strlen(),也显示为12个字符,可能fscanf把’\r' 过滤掉了吧

[ Last edited by rs369007 on 2010-5-2 at 21:09 ]



  freedom!
2010-5-2 21:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: