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

[文本处理] 【已解决】批处理中变量的字符截取怎么与看到的不符

虽然代码是网络方面的,但问题好像是文本处理方面的,希望没发错。
最近我做了个获取网络连接名称的批处理,之前用%jk::=%来删掉冒号,没问题,后来想换成截取的办法,竟然和看到的不符,看代码吧,加双引号是为了证明变量前后没空格和其他字符,不加也一样截取不符。怎么回事?
  1. @echo off
  2. for /f "tokens=1-2,*" %%i in ('ipconfig^|find /i "Ethernet adapter"') do set jk=%%k
  3. echo "%jk%"
  4. echo "%jk::=%"
  5. echo "%jk:~0,-1%"
  6. echo "%jk:~0,-2%"
  7. set jk=%jk%
  8. echo "%jk:~0,-1%"
  9. pause
复制代码
假设我的网络连接名字是:本地连接 测试,运行后结果竟然是

"本地连接 测试:"
"本地连接 测试"
"本地连接 测试:"
"本地连接 测试"
"本地连接 测试"

文字看不清,贴下图

[ 本帖最后由 flyingsand 于 2009-3-25 19:41 编辑 ]
1

评分人数

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

原帖由 Batcher 于 2009-3-25 22:51 发表
多网卡可以这样:@echo off
setlocal enabledelayedexpansion
set count=0
for /f "delims=:" %%a in ('ipconfig^|find /i "Ethernet adapter"') do (
  set /a count+=1
  call :GetName "%%a" !count!
)
fo ...

感谢提供通用代码(orz评分时打错字了)
现在只剩下那个所谓的不可见字符问题了

TOP

回复 17楼 的帖子

多网卡可以这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set count=0
  4. for /f "delims=:" %%a in ('ipconfig^|find /i "Ethernet adapter"') do (
  5.   set /a count+=1
  6.   call :GetName "%%a" !count!
  7. )
  8. for /f "tokens=2 delims==" %%a in ('set LocalConn_') do (
  9.   echo.%%a
  10. )
  11. goto :eof
  12. :GetName
  13. set "str=%1"
  14. set LocalConn_%2=%str:~18,-1%
复制代码
1

评分人数

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

TOP

原帖由 Batcher 于 2009-3-25 22:28 发表
对于安装了VM的用户,可能同时开启了多块虚拟网卡,再加上本机物理网卡,要想写出比较通用就会变得比较复杂。
可以在代码中先判断一下有几块网卡^_^

通用是有点麻烦,我双网卡的代码,第二个有点取巧

TOP

回复 15楼 的帖子

是的,我说的只是思路。
不管那种方法,只要考虑问题全面了,别说双网卡,十个网卡都一样能通用:)
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

你的还没适用双网卡啊。
回到1楼的代码和我4楼的说明,运行后第三行结果应该是没冒号的(和网络连接名称没关),但实际是有,就算是系统默认的名称“本地连接”也是一样,运行一次就知了。

TOP

回复 13楼 的帖子

对于安装了VM的用户,可能同时开启了多块虚拟网卡,再加上本机物理网卡,要想写出比较通用就会变得比较复杂。
可以在代码中先判断一下有几块网卡^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

什么复杂情况,是指多网卡吗?我本来就是做双网卡的,之前是用netsh interface ip show address命令的,但速度比不上ipconfig就用这个了,你那个暂时看不懂
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set jk1=0
  4. set jk2=0
  5. for /f "delims=:" %%a in ('ipconfig^|find /i "Ethernet adapter"') do (
  6. if !jk1!==0 (set jk1=%%a) else set jk2=%%a
  7. )
  8. echo %jk1:~17%
  9. echo %jk2:~17%
  10. pause
复制代码

TOP

另外,在本机网络情况比较复杂的情况下,截取ipconfig的命令返回结果来获取本地连接的方法可能会出现错误。
这里有另外一个思路,可以参考一下:
http://bbs.bathome.net/viewthread.php?tid=1689
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

把空格去掉一样啊
你的没改过吧,运行一楼的代码看下

TOP

回复 9楼 的帖子

因为以这个中文空格是全角的,你换个中文半角空格就行了。
for命令的默认列分隔符里面是不包含全角空格的。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 Batcher 于 2009-3-25 20:32 发表
“本地连接”和“测试”中间那个字符不是空格,而是特殊字符(用十六进展编辑器打开看看就知道了),你从哪里复制来的?为何一定要这样命名本地连接?

中文状态下按空格输入的,只是想说明网络连接的名字可以有空格等的,这样用for的时候就不能直接"tokens=3",不是这个原因吧,把空格去掉也一样啊

TOP

回复 4楼 的帖子

“本地连接”和“测试”中间那个字符不是空格,而是特殊字符(用十六进展编辑器打开看看就知道了),你从哪里复制来的?为何一定要这样命名本地连接?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

对call set "jk=%%k"不会包括不可见字符,不是很理解,又修改了下,绕过了不可见字符,只是数了17个字符,很不爽。
问题算是解决了吧,如果谁对这个问题或不可见字符有新的见解,请跟帖。
  1. @echo off
  2. for /f "delims=:" %%i in ('ipconfig^|find /i "Ethernet adapter"') do set jk=%%i
  3. echo "%jk:~17%"
  4. pause
复制代码

TOP

又想了一下,为什么,第一个set的变量能包括不可见字符
set jk=%jk%这个就没包括了呢

TOP

返回列表