Board logo

标题: [网络连接] [已解决]批处理怎样跳出for并执行循环后的代码? [打印本页]

作者: antony521    时间: 2010-4-18 20:27     标题: [已解决]批处理怎样跳出for并执行循环后的代码?

  1. @echo off
  2. :ready
  3. for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (
  4. if defined dns1 set dns2=%%a.%%b.%%c&goto 0
  5. if /i "%%a %%b"=="Ethernet adapter" set NIC=%%c&set NIC=%NIC:~0,-1%
  6. if /i "%%a %%b"=="IP Address" set "ip=%%c"
  7. if /i "%%a %%b"=="Default Gateway" set "gateway=%%c"
  8. if /i "%%a %%b"=="DNS Servers" set "dns1=%%c")
  9. :0
  10. cls
  11. echo\
  12. echo   连接名称..: %NIC%
  13. echo   当前IP....: %ip%
  14. echo   网关......: %gateway%
  15. echo   当前DNS...: %dns1%
  16. echo   备用DNS...: %dns2%
  17. pause>nul
  18. :1
  19. call :ready
  20. ::测试网络代码........
  21. ping %ip% -n 2>nul&&echo 通||echo 不通
复制代码
.....
现在问题是:
1、测试网络代码段不需要显示各变量,也就是不能用goto 0来跳出for循环,用exit/goto :eof直接退出了也不行。
2、以上显示的%NIC%后面有个冒号,怎样在赋值时去掉?我的方法显示 连接名称..: ~0,-1不知道哪里错了.

[ 本帖最后由 antony521 于 2010-4-19 13:50 编辑 ]
作者: 随风    时间: 2010-4-18 20:33

Q:所发代码不止一行时请用 code 把代码扩起来
A:如何用code把代码扩起来 ,请点我。
call  set NIC=%%NIC:~0,-1%%
或开启变量延迟
set NIC=!NIC:~0,-1!
作者: antony521    时间: 2010-4-18 21:59     标题: 回复 2楼 的帖子

不好使啊!老大!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :ready
  4. for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (
  5. if defined dns1 set dns2=%%a.%%b.%%c&goto 0
  6. if /i "%%a %%b"=="Ethernet adapter" set NIC=%%c&set NIC=!NIC:~0,-1!
  7. if /i "%%a %%b"=="IP Address" set "ip=%%c"
  8. if /i "%%a %%b"=="Default Gateway" set "gateway=%%c"
  9. if /i "%%a %%b"=="DNS Servers" set "dns1=%%c")
  10. :0
  11. cls
  12. echo\
  13. echo   连接名称..: %NIC%
  14. echo   当前IP....: %ip%
  15. echo   网关......: %gateway%
  16. echo   当前DNS...: %dns1%
  17. echo   备用DNS...: %dns2%
  18. pause>nul
  19. :1
  20. call :ready
  21. ::测试网络代码........
  22. ping %ip% -n 2>nul&&echo 通||echo 不通
复制代码


最重要的第一个问题没有答复啊?

[ 本帖最后由 antony521 于 2010-4-18 22:04 编辑 ]
作者: GNU    时间: 2010-4-18 22:06     标题: 回复 3楼 的帖子

具体是哪里不好使啊?
作者: antony521    时间: 2010-4-18 22:14     标题: 回复 4楼 的帖子

echo   连接名称..: %NIC%
显示的NIC带有:号,用set NIC=!NIC:~0,-1!不能去掉.
第一个问题
1、测试网络代码段不需要显示各变量,也就是不能用goto 0来跳出for循环,用exit/goto :eof直接退出了也不行。
没能解决.帮帮忙好吗!
我想把这一段变成类似函数或过程供多处调用,这样就不能用goto 0这种方式跳出循环体,牵扯到别的过程了.
  1. for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (
  2. if defined dns1 set dns2=%%a.%%b.%%c&goto 0
  3. if /i "%%a %%b"=="Ethernet adapter" set NIC=%%c&set NIC=%NIC:~0,-1%
  4. if /i "%%a %%b"=="IP Address" set "ip=%%c"
  5. if /i "%%a %%b"=="Default Gateway" set "gateway=%%c"
  6. if /i "%%a %%b"=="DNS Servers" set "dns1=%%c")
复制代码

不知道说没说明白,找一种能退出循环执行后面代码的方法.

[ 本帖最后由 antony521 于 2010-4-18 22:23 编辑 ]
作者: GNU    时间: 2010-4-18 22:30     标题: 回复 5楼 的帖子

把:后面的数字换成字母
作者: hanyeguxing    时间: 2010-4-18 22:47

专门被call 调用
  1. :ready
  2. for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (
  3. if defined dns1 set dns2=%%a.%%b.%%c&goto:eof
  4. if /i "%%a %%b"=="Ethernet adapter" set NIC=%%c&call set NIC=%%NIC:~0,-2%%
  5. if /i "%%a %%b"=="IP Address" set "ip=%%c"
  6. if /i "%%a %%b"=="Default Gateway" set "gateway=%%c"
  7. if /i "%%a %%b"=="DNS Servers" set "dns1=%%c")
  8. goto:eof
复制代码
放到批处理的最后边
最后的goto:eof是防止ipconfig/all中没有dns1而设置的。如果本标签在批处理最后面的时候,可以不用这个goto:eof。但如果下面还有别的标签,推荐用。主要的返回,是依靠for内的goto:eof完成的

[ 本帖最后由 hanyeguxing 于 2010-4-18 22:55 编辑 ]
作者: antony521    时间: 2010-4-19 12:31     标题: 回复 7楼 的帖子

set NIC=%%NIC:~0,-2%%里为什么是-2呢?没发现:号后面有空格呀!
if defined dns1 set dns2=%%a.%%b.%%c&goto:eof这句中的goto:eof我曾试过,程序直接就退出了,在你这里怎么就运行正常了,哪不对了呢?
作者: GNU    时间: 2010-4-19 12:37     标题: 回复 8楼 的帖子

因为ipconfig命令的结果里面有不可见字符
作者: hanyeguxing    时间: 2010-4-19 15:26

原帖由 antony521 于 2010-4-19 12:31 发表
set NIC=%%NIC:~0,-2%%里为什么是-2呢?没发现:号后面有空格呀!
if defined dns1 set dns2=%%a.%%b.%%c&goto:eof这句中的goto:eof我曾试过,程序直接就退出了,在你这里怎么就运行正常了,哪不对了呢?

1,正常的ANSI编码文本换行效果是由0D 0A(即回车符+换行符)实现的,而这里是0D 0D 0A,即前面多了一个回车符。
你可以把Ethernet adapter这一行:前的字符全去掉,其他行也全去掉,看看这个文本多少字节?
2,不要使用exit/goto :eof。
作者: antony521    时间: 2010-4-20 09:21     标题: 回复 10楼 的帖子

我把这个问题扩展一下吧?又遇到新的情况了.
前提条件是IP是从路由动态获取的.这个IPconfig/all的变化还真是多啊!静态的就没这么麻烦了.
C:\Documents and Settings\Administrator>ipconfig/all

Windows IP Configuration

        Host Name . . . . . . . . . . . . : jishubu
        Primary Dns Suffix  . . . . . . . :
        Node Type . . . . . . . . . . . . : Unknown
        IP Routing Enabled. . . . . . . . : No
        WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter 本地连接:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : Intel(R) PRO/100 VE Network Connecti
on
        Physical Address. . . . . . . . . : 0F-13-20-AA-47-8A
        Dhcp Enabled. . . . . . . . . . . : Yes
        Autoconfiguration Enabled . . . . : Yes
        IP Address. . . . . . . . . . . . : 192.168.1.2
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.1.1
        DHCP Server . . . . . . . . . . . : 192.168.1.1
        DNS Servers . . . . . . . . . . . : 192.168.1.1
        Lease Obtained. . . . . . . . . . : 2010年4月20日 8:12:48
        Lease Expires . . . . . . . . . . : 2010年4月21日 8:12:48
现在是DNS Servers是默认网关的值了,也就是没有正确获得外部的DNS的值,现在我想在检测到DNS Servers值等于默认网关值时设DNS1为空跳出循环.我的不成功代码如下,
  1. @echo off
  2. call :ready
  3. :0
  4. ::cls
  5. echo\
  6. echo   连接名称..: %NIC%
  7. echo   当前IP....: %ip%
  8. echo   网关......: %gateway%
  9. echo   当前DNS...: %dns1%
  10. echo   备用DNS...: %dns2%
  11. pause>nul
  12. :1
  13. ::测试网络代码........
  14. ping -n 2 %ip% >nul&&echo 通||echo 不通
  15. pause>nul
  16. :ready
  17. for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (
  18. if defined dns1 (if /i dns1==gateway set dns1= &goto:eof)else (set dns2=%%a.%%b.%%c&goto:eof)
  19. if /i "%%a %%b"=="Ethernet adapter" set NIC=%%c&call set NIC=%%NIC:~0,-2%%
  20. if /i "%%a %%b"=="IP Address" set "ip=%%c"
  21. if /i "%%a %%b"=="Default Gateway" set "gateway=%%c"
  22. if /i "%%a %%b"=="DNS Servers" set "dns1=%%c")
  23. goto :eof
复制代码
窗口显示:

  连接名称..:
  当前IP....:
  网关......:
  当前DNS...:
  备用DNS...: ..

可能又是变量延迟什么的没用好吧!set local .........,变量加!!都试过了,变量加%也试过了,
这个for就是弄不明白.再烦劳各位大侠给调一下!

[ 本帖最后由 antony521 于 2010-4-20 13:05 编辑 ]
作者: hanyeguxing    时间: 2010-4-20 15:26

  1. @echo off&setlocal enabledelayedexpansion
  2. call :ready
  3. echo.中间部分省略
  4. :ready
  5. for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (
  6. if defined dns1 set dns2=!dns1!&if "!dns1!"=="!gateway!" set "dns1="&goto:eof
  7. if /i "%%a %%b"=="Ethernet adapter" set NIC=%%c&call set NIC=%%NIC:~0,-2%%
  8. if /i "%%a %%b"=="IP Address" set "ip=%%c"
  9. if /i "%%a %%b"=="Default Gateway" set "gateway=%%c"
  10. if /i "%%a %%b"=="DNS Servers" set "dns1=%%c")
  11. goto :eof
复制代码

[ 本帖最后由 hanyeguxing 于 2010-4-20 15:28 编辑 ]




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2