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

[系统相关] 【已解决】批处理的for语句中上尖号转义字符的作用

我在cmd命令行中敲入:wmic NICCONFIG where index=8 get ipaddress,macaddress,description /value
可以返回几行值,没问题的。
但是如果我在批处理中敲入:
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1,* delims==" %%a in ('wmic NICCONFIG where index=8 get ipaddress,macaddress,description /value') do (
  4. set /a tee+=1
  5.   if "!tee!" == "3" echo     网卡类型 = %%b
  6.   if "!tee!" == "4" echo     网卡IP   = %%b
  7.   if "!tee!" == "5" echo     网卡MAC   = %%b
  8. )
  9. pause
复制代码
运行之后就报错,要么说8无效,要么说get无效,想请知道的朋友帮我修改一下并解释下命令语句进了for语句in后面的括号内,应该做什么改变?

[ 本帖最后由 lovebatworld 于 2009-3-21 00:45 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

回复 13楼 的帖子

有了自己“痛苦的思考”,才能掌握的牢固,才能养成独立解决问题的能力。
总是看别人的总结,是无法做到上面这一点的。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 zqz0012005 于 2009-3-21 00:50 发表
http://bbs.verybat.org/viewthread.php?tid=7613


谢谢版主,可惜版主现在才发出这个帖子来,要不然我就不用痛苦的思考这么久了,留着宝贵的时间学习更多的批处理。

TOP

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

非常感谢batcher的解答。我想了一下,并根据自己的想法做了一些试验,对batcher的意思做了一个大胆的猜想,如果有误,还请指出。在批处理中,有些符号是不能被当做普通字符来处理的,它们有着特殊的含义,比如逗号在此例中如果不用上尖号转义字符的话就会被当做命令分隔符,get本意是提取三个选项,但是中间的逗号由于特殊的含义而使后面两个选项无法被get正常提取,所以认为该get是无效的表达式。这个时候就需要使用^号将逗号的特殊功能去掉。至此,我总结了^号这个转义字符的作用:
上尖号转义字符作用是将某些符号的特殊功能去掉,只把它们当成普通的符号而不使用它们的特殊含义。
举例来说:
使用echo haha>a.txt之后,由于>字符的特殊含义,使控制台中没有输出字符串"haha>a.txt",而是将haha字符串输出到a.txt中,而如果使用echo haha^>a.txt,^转义字符去掉了后面的>的特殊功能,而将它当成普通的字符来处理了,所以没有产生a.txt文件,而是在控制台中输出了haha>a.txt
另外我还试验了一个例子是:
  1. @echo off
  2. echo 感^
  3. 谢^
  4. bat^
  5. cher
  6. pause
复制代码
大家可以试试看,结果所有的echo后面的字都在一行上,为什么会这样呢?我的理解是:
echo 感 后面有一个回车符,预处理读到这个回车符就认为读取了一条命令而结束了,这个命令就是echo 感,但是这里加了一个^就不一样了,^将后面的回车符功能去掉,这样预处理读到回车符不会结束而是继续读取下一行,一直读到有着特殊功能的回车符为止,这里的例子中就会一直读到"cher"这个字而结束这条完整的命令--“echo 感谢batcher”,所以就会输出“感谢batcher”的字符串。

[ 本帖最后由 lovebatworld 于 2009-3-21 00:50 编辑 ]
1

评分人数

TOP

回复 7楼 的帖子

因为逗号是默认的命令分隔符之一,和空格的作用类似,如何不使用尖号转义,for里面的wmic会无法正确识别你的代码。
你把@echo off删除就知道了。
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  1. @echo off
  2. wmic NICCONFIG where index=8 get ipaddress,macaddress,description /value
  3. pause
复制代码
这样能得到结果

TOP

其中将"index=8"改成" index='8'  "也是对的。

TOP

恩,版主的这段代码我也有,只有这么写不会错,但不知道是何道理,所以贴上来问一下,看看有没有人知道。

TOP

我也不知道为什么要这样,只知道这样不会报错。
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1,* delims==" %%a in (
  4. 'wmic NICCONFIG where "index=8" get ipaddress^,macaddress^,description /value'
  5. ) do (
  6. set /a tee+=1
  7.   if "!tee!" == "3" echo     网卡类型 = %%b
  8.   if "!tee!" == "4" echo     网卡IP   = %%b
  9.   if "!tee!" == "5" echo     网卡MAC   = %%b
  10. )
  11. pause
复制代码
技术问题请到论坛发帖求助!

TOP

谢谢楼上,不过我复制了你的代码运行之后,还是报同样的错误。

TOP

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1,* delims==" %%a in (
  4. 'wmic NICCONFIG where index=8 get ipaddress,macaddress,description /value'
  5. ) do (
  6. set /a tee+=1
  7.   if "!tee!" == "3" echo     网卡类型 = %%b
  8.   if "!tee!" == "4" echo     网卡IP   = %%b
  9.   if "!tee!" == "5" echo     网卡MAC   = %%b
  10. )
  11. pause
复制代码

TOP

谢谢版主提醒,已经改好了。

TOP

本版规则
1、求代码、寻求代码解释、探讨代码得失的帖子均可发在本版块,其余话题禁止在本版讨论;
2、求助时,务必在顶楼一次性把问题交代清楚;若文字难以表述,请配图说明,或是上传附件;但是,一切操作应从节约论坛资源的角度出发,能文字说明清楚的就无需再发图片,小图能说明问题的尽量不截全图,在不影响效果的前提下尽量压缩图片及附件;
3、所发代码若不止一行,请务必用code标记把代码部分首尾括起来,以便他人复制;


Q: 如何用code把代码扩起来?
A: http://bbs.bathome.net/thread-404-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表