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

[网络连接] 怎么通过批处理扫描局域网在线主机名、IP、MAC

本帖最后由 爱美痞子 于 2022-4-7 12:41 编辑

请教各位
我手里现有一组代码,可以实现扫描局域网在线的主机名、IP和MAC,但是有的时候使用环境的局域网电脑没有安装computer browser服务,也不允许安装,所以就没有办法使用net view命令,返回值是列表为空,请问怎么能够通过不使用net view命令来实现扫描局域网内在线主机的主机名、IP和MAC,生成列表,列表不需要输出到文件,谢谢!
  1. @echo off
  2. setlocal enabledelayedexpansion>nul
  3. echo.
  4. echo.                       【 局域网在线主机列表 】
  5. echo.    -------------------------------------------------------------
  6. echo.    ^|      主机名       ^|      IP地址       ^|      MAC地址      ^|
  7. echo.    -------------------------------------------------------------
  8. for /f "skip=3 delims=\ " %%a in ('net view') do (
  9. set "host=                         %%a  "
  10. set ip=
  11. set mac=
  12. for /f "tokens=2 delims=[]" %%b in ('ping -4 %%a -n 1 ^|find /i "ping %%a"') do set "ip=                       %%b  "
  13. for /f "tokens=4 delims= " %%c in ('nbtstat -a %%a ^|find /i "MAC 地址"') do set "mac=                      %%c "
  14. if not defined ip set "ip=            "
  15. if not defined mac set "mac=       -----       "
  16. echo.    ^|!host:~-19!^|!ip:~-19!^|!mac:~-19!^|
  17. echo.    -------------------------------------------------------------
  18. )
  19. echo.
  20. pause
复制代码

如无特别说明,代码测试环境均为 XP SP3

TOP

回复 2# cutebe


    我之前就拜读过您的那个跟帖,不过您那组命令执行结束之后窗口就关闭了,没看到整理后的结果,我是非专业的,试了几次没整成。。。

TOP

命令提示符中运行以下命令,看下结果
  1. nbtstat -a %没有computer_browser服务的电脑IP%
复制代码
再把自动关闭的批处理拖命令提示符窗口中,回车运行,看下显示什么!
如无特别说明,代码测试环境均为 XP SP3

TOP

本帖最后由 爱美痞子 于 2022-4-10 21:24 编辑
命令提示符中运行以下命令,看下结果再把自动关闭的批处理拖命令提示符窗口中,回车运行,看下显示什么!
cutebe 发表于 2022-4-8 14:42



    这个显示正常。

我整理了一下,目前的代码如下:
  1. @echo off
  2. mode con cols=70 lines=39
  3. color e0
  4. echo.
  5. echo 扫描完1→255的整个网段大约需要3分钟的时间,请耐心等待......
  6. echo.
  7. echo 输入要扫描的IP段,直接回车则为此前输入的IP段(没输过则为192.168.1):
  8. set /p IpDuan=
  9. if "%IpDuan%"=="" (set IpDuan=192.168.1)
  10. echo 输入要扫描的IP起始位,直接回车则为此前输入的数值(没输过则为1):
  11. set /p QiShi=
  12. if "%QiShi%"=="" (set QiShi=1)
  13. echo 输入要扫描的IP结束位,直接回车则为此前输入的数值(没输过则为255):
  14. set /p JieShu=
  15. if "%JieShu%"=="" (set JieShu=255)
  16. cls
  17. echo.
  18. echo.   正在扫描[ %IpDuan%.%QiShi%-%IpDuan%.%JieShu% ]IP段内在线的主机。
  19. ::ping -n 1 -w 99 %ip%/ping -a
  20. ::nbtstat -a %ip%
  21. echo.
  22. echo.                     【 局域网在线主机列表 】
  23. echo.   ----------------------------------------------------------------
  24. echo.   ^    IP地址      ^           主机名       ^           MAC地址       ^
  25. echo.   ----------------------------------------------------------------
  26. setlocal enableDelayedExpansion
  27. set "ip3=%IpDuan%"
  28. for /l %%i in (%QiShi%,1,%JieShu%)do (
  29.         rem echo %%i
  30.         call :CheckIPstatus %ip3%.%%i&&call :GetIPNameMAC %ip3%.%%i Name MAC
  31.         if !errorlevel! equ 0 echo/   [%ip3%.%%i]        [!Name!]        [!MAC!]
  32. )
  33. echo.   ------------------------  扫描完成  ----------------------------
  34. echo.
  35. echo.
  36. pause |echo   按任意键退出。
  37. ::[完]
  38. ::ping是否通:返回码stat=失败/Lost
  39. :CheckIPstatus
  40. for /f "tokens=3 delims=,," %%p in ('"ping -n 1 -w 99 %1|findstr /i "数据包 Packets""')do (
  41.         for /f "tokens=3" %%s in ("%%p")do set "stat=%%s"
  42. )
  43. exit/b %stat%
  44. ::nbtstat查ip对应计算机名、MAC
  45. :GetIPNameMAC IP Name MAC
  46. setlocal
  47. for /f "delims=" %%n in ('"nbtstat -a %1|findstr /ic:"唯一" /c:"UNIQUE" /c:"MAC ""')do (
  48.         set "nbt=%%n"
  49.         set "nbt=!nbt:<= !"
  50.         set "nbt=!nbt:>=!"
  51.         if "!nbt:唯一=!!nbt:UNIQUE=!" neq "!nbt!!nbt!" for /f %%m in ("!nbt!")do set "Name=%%m"
  52.         if "!nbt:MAC=!" neq "!nbt!" for /f "tokens=4" %%m in ("!nbt!")do set "MAC=%%m"
  53. )
  54. if "%MAC%"=="" (set Bcode=1)else set Bcode=0
  55. endlocal&set %2=%Name%&set %3=%MAC%&exit/b %Bcode%
复制代码
有一个问题,因为nbtstat -a命令无法获取到本机的主机名和MAC,所以返回结果里本机对应的主机名和MAC是前一个IP的主机的,可否将这2个返回值定义成其他内容,比如“本机”,谢谢!

TOP

我目前整理的代码如下:
  1. @echo off
  2. mode con cols=70 lines=39
  3. color e0
  4. set "NetIndex="
  5. for /f "tokens=1* delims==" %%a in ('wmic nic where "NetEnabled=TRUE and not Name like '%%Virtual%%'" get index /value^|find "="') do set NetIndex=%%b
  6. if defined NetIndex (
  7. echo.当前正在使用的网卡的Index值:%NetIndex%)>nul
  8. wmic nicconfig where index=%NetIndex% call SetTcpipNetbios 0 >nul
  9. cls
  10. setlocal enabledelayedexpansion>nul
  11. set "MACAddress="
  12. for /f "tokens=1* delims==" %%a in ('wmic nic where "NetEnabled=TRUE and not Name like '%%Virtual%%'" get MACAddress /value^|find "="') do set MACAddress=%%b
  13. if defined MACAddress (
  14. echo.网卡的MAC地址:%MACAddress%)>nul
  15. )
  16. set "MACAddress=%MACAddress: =%"
  17. echo.
  18. echo.                      局域网在线主机扫描助手
  19. echo.
  20. echo 输入要扫描的IP段,直接回车则为此前输入的IP段(没输过则为192.168.1):
  21. set /p IpDuan=
  22. if "%IpDuan%"=="" (set IpDuan=192.168.1)
  23. echo 输入要扫描的IP起始位,直接回车则为此前输入的数值(没输过则为2):
  24. set /p QiShi=
  25. if "%QiShi%"=="" (set QiShi=2)
  26. echo 输入要扫描的IP结束位,直接回车则为此前输入的数值(没输过则为255):
  27. set /p JieShu=
  28. if "%JieShu%"=="" (set JieShu=255)
  29. cls
  30. echo.
  31. echo.   扫描完1→255的整个网段大约需要3分钟的时间,请耐心等待......
  32. echo.
  33. echo.   当前正在扫描[ %IpDuan%.%QiShi%-%IpDuan%.%JieShu% ]IP段内在线的主机。
  34. ::ping -n 1 -w 99 %ip%/ping -a
  35. ::nbtstat -a %ip%
  36. echo.
  37. echo.                      【 局域网在线主机列表 】
  38. echo.   ----------------------------------------------------------------
  39. echo.   ^    IP地址      ^            MAC地址       ^        主机名       ^
  40. echo.   ----------------------------------------------------------------
  41. setlocal enableDelayedExpansion
  42. set "ip3=%IpDuan%"
  43. for /l %%i in (%QiShi%,1,%JieShu%)do (
  44. rem echo %%i
  45. call :CheckIPstatus %ip3%.%%i&&call :GetIPNameMAC %ip3%.%%i Name MAC
  46. if !errorlevel! equ 0 echo/  [ %ip3%.%%i ] [!mac:~-20! ] [!Name:~-20!]
  47. )
  48. echo.   ------------------------  扫描完成  ----------------------------
  49. echo.
  50. echo.   * 其中MAC地址大写的行是本机信息。
  51. echo.
  52. pause |echo   按任意键退出。
  53. ::[完]
  54. ::ping是否通:返回码stat=失败/Lost
  55. :CheckIPstatus
  56. for /f "tokens=3 delims=,," %%p in ('"ping -n 1 -w 99 %1|findstr /i "数据包 Packets""')do (
  57. for /f "tokens=3" %%s in ("%%p")do set "stat=%%s"
  58. )
  59. exit/b %stat%
  60. ::nbtstat查ip对应计算机名、MAC
  61. :GetIPNameMAC IP Name MAC
  62. setlocal enabledelayedexpansion
  63. set name=其他非电脑设备
  64. set MAC= %MACAddress%
  65. for /f "tokens=3 delims= " %%m in ('ping -a -n 1 %1 ^|find /i "["') do set "name=%%m "
  66. echo.name:%name%>nul
  67. for /f "tokens=2 delims= " %%m  in ('arp -a %1 ^|find /i "%1"') do set "MAC= %%m"
  68. echo.MAC:%MAC%>nul
  69. if "%MAC%"=="" (set Bcode=1)else set Bcode=0
  70. endlocal&set %2=%Name%&set %3=%MAC%&exit/b %Bcode%
复制代码
我是白丁,不懂写代码,代码中可能会存在一些无用的或者繁琐的代码,见笑了。
另外,因为扫描整个网段的时间比较长,哪位大神方便帮优化一下,或者加一个进度显示的提示,滚动条或者百分比都行,谢谢!

TOP

返回列表