Board logo

标题: [网络连接] 【已解决】遍历所有网卡后选择其中一张网卡显示对应的IPv4地址和网关 [打印本页]

作者: semiuel    时间: 2024-2-7 21:53     标题: 【已解决】遍历所有网卡后选择其中一张网卡显示对应的IPv4地址和网关

本帖最后由 semiuel 于 2024-2-11 14:14 编辑

首先参考了Batcher老大的这个帖子:
http://www.bathome.net/viewthread.php?tid=67519

经过大佬的指点,修改后的代码在11楼,欢迎大家测试。
运行批处理前请提前准备好EchoX.exe
下载地址:https://wwf.lanzn.com/iKmg608z89ub


用netsh interface ipv4 show addresses获取到网卡对应的接口名称,IPv4地址和默认网关。
我的电脑上运行后输出内容如下:
  1. 接口 "Radmin VPN" 的配置
  2.     DHCP 已启用:                          否
  3.     IP 地址:                           26.13.134.145
  4.     子网前缀:                        26.0.0.0/8 (掩码 255.0.0.0)
  5.     默认网关:                         26.0.0.1
  6.     网关跃点数:                       9256
  7.     InterfaceMetric:                      1
  8. 接口 "本地连接" 的配置
  9.     DHCP 已启用:                          否
  10.     IP 地址:                           192.168.1.240
  11.     子网前缀:                        192.168.1.0/24 (掩码 255.255.255.0)
  12.     默认网关:                         192.168.1.1
  13.     网关跃点数:                       256
  14.     InterfaceMetric:                      10
  15. 接口 "Loopback Pseudo-Interface 1" 的配置
  16.     DHCP 已启用:                          否
  17.     IP 地址:                           127.0.0.1
  18.     子网前缀:                        127.0.0.0/8 (掩码 255.0.0.0)
  19.     InterfaceMetric:                      50
复制代码
写了下面的代码用来获取所有网卡
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 请选择一个网卡:
  4. set "choice="
  5. set "count=1"
  6. for /f "tokens=1 delims=:" %%a in ('netsh interface ipv4 show addresses ^| findstr "接口"') do (
  7.     set adapter=%%a
  8.     echo !count!.!adapter:~4,-5!
  9.     set /a count+=1
  10. )
  11. set /p choice=请输入序号:
复制代码
接下来不知道该怎么写来获取每张网卡的IPv4地址和默认网关了。
我的本意是想跟这个帖子里的IP扫描结合起来
http://www.bathome.net/thread-68407-1-1.html
用这个帖子里获取到的IPv4地址和默认网关来确定IP扫描的网段。

请求大神们帮忙看看。
作者: semiuel    时间: 2024-2-8 10:49

大佬们都回家过年了啊!

祝大家新春快乐!
作者: holley    时间: 2024-2-8 10:54

本帖最后由 holley 于 2024-2-8 11:11 编辑

回复 1# semiuel
先把网卡名称读出来:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 请选择一个网卡:
  4. set "choice="
  5. set "count=1"
  6. for /f "tokens=1 delims=:" %%a in ('netsh interface ipv4 show addresses ^| findstr "接口"') do (
  7.      set "adapter=%%a"
  8.      set "adapter=!adapter:~4,-5!"
  9.      echo !count!. !adapter!
  10.      set "interface!count!=!adapter!"
  11.      set /a "count+=1"
  12. )
  13. set /p "choice=请输入序号:"
  14. rem 获取选定网卡的IP及网关信息
  15. set "interfaceName=!interface%choice%!"
  16. rem echo 已选网卡:!interfaceName!
  17. for /f "tokens=1-2 delims=:" %%i in ('netsh interface ipv4 show config name^="!interfaceName!" ^| findstr /C:"IP 地址"') do (
  18.     set "ip_line=%%j"
  19.     for /f "tokens=*" %%f in ("!ip_line!") do set "ipAddress=%%f"
  20.     echo !interfaceName!-[IP  地址]:!ipAddress!
  21. )
  22. rem 提取已选网卡的默认网关
  23. for /f "tokens=1-2 delims=:" %%i in ('netsh interface ipv4 show config name^="!interfaceName!" ^| findstr /C:"默认网关"') do (
  24.     set "gateway=%%j"
  25.     for /f "tokens=*" %%f in ("!gateway!") do set "gateway=%%f"
  26.     if not "!gateway!"=="" (
  27.         echo !interfaceName!-[默认网关]:!gateway!
  28.     ) else (
  29.         echo 该网卡没有配置默认网关。
  30.     )
  31. )
  32. pause
复制代码

作者: hnfeng    时间: 2024-2-8 10:57

本帖最后由 hnfeng 于 2024-2-8 10:58 编辑

你只是想获取正在使用的网卡的地址吧,CMD里面:
  1. for /f "tokens=3,4" %i in ('route print -4 ^| findstr /rc:" 0\.0\.0\.0 *0\.0\.0\.0 "') do @echo IP地址: %j, 默认网关:%i
复制代码

作者: holley    时间: 2024-2-8 11:23

回复 2# semiuel


    试了一下,结果存疑:
  1. @echo off & mode con cols=40 lines=31 & color f0 & setlocal enabledelayedexpansion
  2. echo 请选择一个网卡:
  3. set "choice="
  4. set "count=1"
  5. for /f "tokens=1 delims=:" %%a in ('netsh interface ipv4 show addresses ^| findstr "接口"') do (
  6.      set "adapter=%%a"
  7.      set "adapter=!adapter:~4,-5!"
  8.      echo !count!. !adapter!
  9.      set "interface!count!=!adapter!"
  10.      set /a "count+=1"
  11. )
  12. set /p "choice=请输入序号:"
  13. set "interfaceName=!interface%choice%!"
  14. for /f "tokens=1-2 delims=:" %%i in ('netsh interface ipv4 show config name^="!interfaceName!" ^| findstr /C:"IP 地址"') do (
  15.     set "ip_line=%%j"
  16.     for /f "tokens=*" %%f in ("!ip_line!") do set "IP=%%f"
  17.     REM echo !interfaceName!-[IP  地址]:!IP!
  18. )
  19. for /f "tokens=1-2 delims=:" %%i in ('netsh interface ipv4 show config name^="!interfaceName!" ^| findstr /C:"默认网关"') do (
  20.     set "gateway=%%j"
  21.     for /f "tokens=*" %%f in ("!gateway!") do set "GW=%%f"
  22.     if not "!GW!"=="" (
  23.         REM echo !interfaceName!-[默认网关]:!GW!
  24.     ) else (
  25.         echo 该网卡没有配置默认网关。
  26.     )
  27. )
  28. echox -n "本机IP:" & echox -w 25 -n -c fc "%IP%" & echox -n -c 9f "  "  & echox "在线"
  29. echox -n "网  关:" & echox -w 25 -n -c fc "%GW%" & echox -n -c 80 "  "  & echox "空闲"
  30. echo.
  31. set on=0&set off=0
  32. for /f "tokens=2-4 delims=.: " %%a in ('ipconfig/all^|findstr "默认网关"') do (
  33.   for /l %%i in (1,1,254) do (
  34.   title IP扫描:%%a.%%b.%%c.%%i
  35.   ping -n 1 -l 1 -w 20 -i 10 -s 1 %%a.%%b.%%c.%%i>nul 2>nul && (set /a on=on+1 & echox -w 4 -e -n -c 9f %%i) || (set /a off=off+1 & echox -w 4 -e -n -c 80 %%i)
  36.   )
  37. )
  38. echo.
  39. title IP扫描:结束
  40. echox -n -c f0 "扫描结束,在线IP:"&echox -w 4 -r -n -c 9f %on%&echox -n -c f0 "  空闲IP:"&echox  -w 4 -r -c 80 %off%
  41. pause>nul 2>nul
复制代码

作者: newswan    时间: 2024-2-8 11:36

powershell
  1. $ip = Get-NetIPAddress -AddressFamily "IPv4"
  2. $rt = Get-NetRoute
  3. $ip | add-member -NotePropertyName "NextHop" -NotePropertyValue ""
  4. foreach ( $x in $ip ) {
  5. $y = $rt | Where-Object { ($_.InterfaceAlias -eq $x.InterfaceAlias) -and ($_.DestinationPrefix -eq '0.0.0.0/0') }
  6. $x.NextHop = $y.NextHop
  7. }
  8. $ip | Select-Object interfacealias,nexthop
复制代码

作者: semiuel    时间: 2024-2-8 13:23

回复 5# holley


    好的,感谢大佬,我试试看。
作者: semiuel    时间: 2024-2-8 13:25

回复 4# hnfeng


    谢谢
作者: semiuel    时间: 2024-2-8 13:26

回复 6# newswan


    我想做一个WIN7/10/11通用的脚本,WIN7没办法用POWERSHELL
作者: ppll2030    时间: 2024-2-8 13:53

回复 1# semiuel


    根据你的第一部分网卡读取做了一些修改,
完善第二部分地址读取,并设置了变量,
第三部分自己修改一下变量设置,就可拼接上了。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. netsh interface ipv4 show addresses>temp.txt
  4. set "count=1"
  5. for /f "tokens=1 delims=:" %%a in ('findstr "接口" "temp.txt"') do (
  6.     set adapter=%%a
  7.     echo !count!. !adapter:~4,-5!
  8.     set  _!count!=!adapter:~4,-5!
  9.     set /a count+=1
  10. )
  11. echo 请选择一个网卡:
  12. set /p choice=请输入序号:
  13. set AdapterName=!_%choice%!
  14. for /f "delims=:" %%i in ('findstr /n /c:"!AdapterName!" "temp.txt"') do (
  15.     set /a a=%%i+2
  16.     set /a b=%%i+4
  17. )
  18. :a
  19. set /a a+=1
  20. for /f "skip=%a% tokens=2,4 delims= " %%i in ('find /v /n "" temp.txt') do (
  21. set IP=%%j
  22. goto b
  23. )
  24. :b
  25. set /a b+=1
  26. for /f "skip=%b% tokens=2-3 delims= " %%i in ('find /v /n "" temp.txt') do (
  27. set GW=%%j
  28. goto end
  29. )
  30. :end
  31. cls
  32. echo 网卡:    %AdapterName%
  33. echo IP地址:  %IP%
  34. echo 网关地址:%GW%
  35. del /q temp.txt
  36. pause
复制代码

作者: semiuel    时间: 2024-2-8 13:56

本帖最后由 semiuel 于 2024-2-8 14:16 编辑

回复 5# holley


    稍微修改了一下大佬的代码,试了两台电脑暂时没问题了。
  1. @echo off & mode con cols=40 lines=31 & color f0 & setlocal enabledelayedexpansion
  2. title IP扫描:选择网卡
  3. echo 请选择一个网卡:
  4. set "choice="
  5. set "count=1"
  6. for /f "tokens=1 delims=:" %%a in ('netsh interface ipv4 show addresses ^| findstr "接口"') do (
  7.      set "adapter=%%a"
  8.      set "adapter=!adapter:~4,-5!"
  9.      echo !count!. !adapter!
  10.      set "interface!count!=!adapter!"
  11.      set /a "count+=1"
  12. )
  13. set /p "choice=请输入序号:"
  14. set "interfaceName=!interface%choice%!"
  15. for /f "tokens=1-2 delims=:" %%i in ('netsh interface ipv4 show config name^="!interfaceName!" ^| findstr /C:"IP 地址"') do (
  16.     set "ip_line=%%j"
  17.     for /f "tokens=*" %%f in ("!ip_line!") do set "IP=%%f"
  18.     REM echo !interfaceName!-[IP  地址]:!IP!
  19. )
  20. for /f "tokens=1-2 delims=:" %%i in ('netsh interface ipv4 show config name^="!interfaceName!" ^| findstr /C:"默认网关"') do (
  21.     set "gateway=%%j"
  22.     for /f "tokens=*" %%f in ("!gateway!") do set "GW=%%f"
  23.     if not "!GW!"=="" (
  24.         REM echo !interfaceName!-[默认网关]:!GW!
  25.     ) else (
  26.         set "GW=没有配置默认网关"
  27.     )
  28. )
  29. cls
  30. echox -n "本机IP:" & echox -w 25 -n -c fc "%IP%" & echox -n -c 9f "  "  & echox "在线"
  31. echox -n "网  关:" & echox -w 25 -n -c fc "%GW%" & echox -n -c 80 "  "  & echox "空闲"
  32. echo.
  33. set on=0&set off=0
  34. REM 下面这一句修改了一下,改成直接从IP地址获取需要扫描的网段,而不是从网关获取
  35. for /f "tokens=1-3 delims=.: " %%a in ("%IP%") do (
  36.   for /l %%i in (1,1,254) do (
  37.   title IP扫描:%%a.%%b.%%c.%%i
  38.   ping -n 1 -l 1 -w 20 -i 10 -s 1 %%a.%%b.%%c.%%i>nul 2>nul && (set /a on=on+1 & echox -w 4 -e -n -c 9f %%i) || (set /a off=off+1 & echox -w 4 -e -n -c 80 %%i)
  39.   )
  40. )
  41. echo.
  42. title IP扫描:结束
  43. echox -n -c f0 "扫描结束,在线IP:"&echox -w 4 -r -n -c 9f %on%&echox -n -c f0 "  空闲IP:"&echox  -w 4 -r -c 80 %off%
  44. pause>nul 2>nul
复制代码

作者: semiuel    时间: 2024-2-8 14:14

回复 10# ppll2030


    谢谢大佬




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