中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-12 09:05
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » for 里面的一个现象 查看 1,172 回复 3
楼 主 for 里面的一个现象 发表于 2010-05-02 16:02 ·  中国 四川 攀枝花 电信
初级用户
★★
积分 147
发帖 131
注册 2008-09-22 23:54
17年会员
UID 126352
性别 男
状态 离线
@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!
2 发表于 2010-05-02 17:18 ·  中国 山西 临汾 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
问题在于ipconfig
在它的输出文本中
每行末尾都会多一个回车符(\r,CR,0x0d)
也就是它的每行行尾都是\r\r\n
多出来的\r被for/f提取到并存储到变量中
而你的例子
因为没有将空格设为delims
所以IP前的空格也被存到变量中
所以变量DNSservers的值为
<空格>218.6.132.39<回车>

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

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

[ Last edited by qzwqzw on 2010-5-2 at 17:19 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
rs369007 +2 2010-05-02 17:25
3 发表于 2010-05-02 18:34 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
Vista、Win7系统没有这个问题
4 发表于 2010-05-02 21:05 ·  中国 四川 攀枝花 电信
初级用户
★★
积分 147
发帖 131
注册 2008-09-22 23:54
17年会员
UID 126352
性别 男
状态 离线
刚在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!
论坛跳转: