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

[文本处理] 局域网MAC地址查询批处理无法获取主机名?

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (12,1,15) do (
  4. for /f "tokens=1* delims==" %%i in ('ping 192.168.2.%%a -n 1 -w 20 -l 1 ^>nul ^& if not errorlevel 1 nbtstat -a 192.168.2.%%a') do (
  5.   if not "%%j" == "" echo.arp -s 192.168.2.%%a  %%j>>arp绑定.bat
  6.                            )
  7.              )
  8. pause
复制代码
因为192.168.2.12是没开机的,所以输出结果是:
arp -s 192.168.2.13   00-30-18-AE-D5-53
arp -s 192.168.2.14   00-30-18-AE-D4-77
arp -s 192.168.2.15   00-30-18-A5-45-BD
1.闲着没事,就写了这个代码。起初我是想获得“C013  192.168.2.13   00-30-18-AE-D5-53”这样的格式,但是C013这个hostname我想破脑壳都提不出来,请教这个hostname该怎么提出来赋予变量。

2.另外一点是当这个IP地址范围取大了以后,比如我这的实际情况1-178,在只有31台机子开启的情况下,时间消耗2分钟少一点,对比一下网上的局域网mac地址扫描器要慢个3秒左右,但是那个还要导出结果,还要用批处理重新排版,时间消耗比这个代码多。所以我认为可行。重新指定了数据包大小为1,在21台电脑开机的情况小,效率提高了20秒,而且我认为不开的机子越多,耗时越长。

3.当IP不在同一个段内时,比如192.168.0.1到192.168.2.178时,我的想法是设置输入起始IP和结束IP,设置相应的变量,然后在外面套循环。但是假如输入起始IP192.168.0.1,结束IP是192.168.2.65。此时在每一个IP段内如果设置循环是1-65,明显如果192.168.0.x超过65,结果将不如人意,如果设置1-254的话,对于输出结果来说应该是没有问题的,但是效率将会是个问题

[ 本帖最后由 sgaizxt001 于 2010-5-5 18:36 编辑 ]
努力学习,努力挣分

  1. @echo off&setlocal enabledelayedexpansion
  2. set/p min=请输入起始IP:
  3. set/p max=请输入结束IP:
  4. for /f "tokens=3,4 delims=." %%m in ("%min%") do (
  5.   set min_3=%%m
  6.   set min_4=%%n
  7.                                                  )
  8. for /f "tokens=3,4 delims=." %%x in ("%max%") do (
  9.   set max_3=%%x
  10.   set max_4=%%y
  11.                                                  )
  12. set t=%time%
  13. for /l %%b in (%min_3%,1,%max_3%) do (
  14. for /l %%a in (%min_4%,1,%max_4%) do (
  15.    for /f "tokens=1* delims==" %%i in ('ping 192.168.%%b.%%a -n 1 -w 20 /l 1 ^>nul ^& if not errorlevel 1 nbtstat -a 192.168.%%b.%%a') do (
  16.      if not "%%j" == "" echo.arp -s 192.168.%%b.%%a  %%j>>arp绑定.bat
  17.                            )
  18.              )
  19. )
  20. echo %t%
  21. echo %time%
  22. pause
复制代码
这个代码就涉及到第三点,如何规定起始IP和结束IP的各个IP段的范围

[ 本帖最后由 sgaizxt001 于 2010-5-4 06:57 编辑 ]
努力学习,努力挣分

TOP

设计上缺乏灵活性

建议你的程序应该支持IP列表
就是一行一个IP的独立外部文件

对于非C类地址的支持
应该采用网段加掩码的形式
而不要用所谓起始地址

最后程序应该可以根据自身连接的IP地址和掩码
换算出所在的网段地址与范围
进而给出默认的扫描范围
天的白色影子

TOP

回复 2楼 的帖子

其他的部分没看,光看设置输入起始IP和结束IP部分了,明显设计错误。
忽略有效性,实际IP就是4位256进制数字,如果只循环后两位,那么这个for /f应该写成:
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p min=请输入起始IP:
  3. set/p max=请输入结束IP:
  4. for /f "tokens=3,4,7,8 delims=." %%a in ("%min%.%max%") do set a=%%a&set b=%%b&set c=%%c&set d=%%d
  5. for /l %%b in (%b%,1,255) do (
  6. echo.%a%.%%b
  7. if %a%.%%b==%c%.%d% goto:end
  8. )
  9. set/a a+=1
  10. for /l %%a in (%a%,1,255) do for /l %%b in (0,1,255) do (
  11. echo.%%a.%%b
  12. if %%a.%%b==%c%.%d% goto:end
  13. )
  14. :end
  15. pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-4 08:53 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回师傅:我2楼的代码是为了我的第3个问题而弄出来的。也就是192.168.0.1到192.168.2.x这种情况时该怎么设计的问题。另外一般255是有特殊用途的,在IP配置的时候基本是不会配置成xxx.xxx.xxx.255的,你的代码我也还没看仔细。要下班了,晚上来看。郁闷,我总是上夜班!

回qzwqzw:如果支持外部文件IP列表的话,可以设计choice选择的样子,多种方法,不过我目前得先把我遇到的这几个问题解决。
另外如果根据子网掩码来设计默认的扫描范围的话,我感觉是考虑的有点多了,比如我这子网掩码是255.255.252.0,本身IP是192.168.0.x,换算一下,子网掩码的样式可支持的机子就1000多台了,但是我只有530台机子。那样因为ping每个不通IP而出现的时间损失,等最后得出结果的话估计需要很长时间。如果不考虑时间的话可以考虑进来。
对于非C类地址的支持也不是很大的问题,可以以后完善,谢谢你的建议

[ 本帖最后由 sgaizxt001 于 2010-5-4 17:17 编辑 ]
努力学习,努力挣分

TOP

如果单纯循环192.168.0.1-254,192.168.1.1-254,192.168.2.1-100,可以直接写成:
  1. @echo off
  2. for %%a in (0,1,2) do for /l %%b in (1,1,254) do (
  3. echo.192.168.%%a.%%b
  4. if %%a.%%b==2.100 goto:end)
  5. :end
  6. pause
复制代码
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

我这的IP是这样分的0.1-0.178,1.1-1.176,2.1-2.178。从178到254这一段在循环时添加进来的话是浪费时间的,从另外一个角度来说,如果设置让他从1-254的循环的话,直接按IP地址的第3位来循环就可以了。但是如果写的灵活一点的话,这里就出现了效率的问题。不过你的两个代码都给我启示。现在我想根据nbtstat的输出结果:
  1. 本地连接:
  2. Node IpAddress: [192.168.2.149] Scope Id: []
  3.            NetBIOS Remote Machine Name Table
  4.        Name               Type         Status
  5.     ---------------------------------------------
  6.     C149           <00>  UNIQUE      Registered
  7.     WORKGROUP      <00>  GROUP       Registered
  8.     MAC Address = 00-E0-4C-D0-02-31
复制代码
来提取计算机名字C149

我先根据qzw的建议多写一些出来,你帮我提提这个名字嘛,我提不出来

[ 本帖最后由 sgaizxt001 于 2010-5-4 17:51 编辑 ]
努力学习,努力挣分

TOP

如果对方没开机或是已经禁用了NETBIOS那么你用NBTSTAT将是十分的慢,像类似这样的问题,推荐使用第三方软件。

TOP

1, 试试用net view 来获取计算机名列表,即使对方没开机,这在域环境会相对准确点
2, ping是否成功,可以直接用 ping /n 1 192.168.1.1&&
3, 如果不是跨网段,那么 start /b ping /n 1 192.168.1.%%a 速度会快很多,虽然返回值无法准确或许,但可以到最后用arp -a 得到mac地址

如8楼,获取计算机名,跨网段MAC依赖netbios..

如果你是管理员,完全可以在dhcp上得到你想要的

[ 本帖最后由 caruko 于 2010-5-9 13:30 编辑 ]

TOP

返回列表