Board logo

标题: [注册表类] [已解决]批处理检测在线ip和计算机名。。并对比txt文件(计算机名和ip)列表。。 [打印本页]

作者: ygqiang    时间: 2015-7-14 08:23     标题: [已解决]批处理检测在线ip和计算机名。。并对比txt文件(计算机名和ip)列表。。

本帖最后由 ygqiang 于 2015-7-16 20:59 编辑

[已解决]批处理检测在线ip和计算机名。。并对比txt文件(计算机名和ip)列表。。

xp环境下的局域网,获取在线IP和对应的计算机名,对比,保存在txt文件里的ip、计算机名是否一致。。

下面这个bat代码,可以实现:
按照规则,ping某个ip。。ping通的话,获取到ip对应的计算机名。(ping不通,就继续ping下一个ip)
。。然后按照计算机名-ip的格式,保存到txt文件里。。。

我需要的功能是:


按照规则,先ping某个ip,如果ping通。。。就获取对应的计算机名a(ping不通,就继续ping下一个ip)
1、如果ip不在txt文件里面,就保存在新的txt文件里(格式是计算机名a-ip)
2、如果ip在txt文件里,就继续获取txt文件里ip对应的计算机名b。
2.1、计算机名也一致(a和b一样),就继续ping下一个ip
2.2、计算机名不一致(a和b不一样),也是保存在新的txt文件里(格式也是计算机名a-ip)

需要修改的bat代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "aa= "
  4. ———————————————————————————————————————————————————————————————
  5. cls
  6. for /f "tokens=15 delims= " %%i in ('ipconfig ^| find /i "IP Address"') do (
  7.     set fsip=%%i
  8. )
  9. echo %fsip%
  10. for /f "tokens=1,2,3 delims=." %%i in ("%fsip%") do (
  11.     set a=%%i.%%j.%%k
  12. )
  13. echo %a%
  14. set Gateway=%a%.1
  15. ———————————————————————————————————————————————————————————————
  16. cls
  17. del /f /q 在线计算机名-ip.txt >nul 2>nul
  18. for /l %%m in (2,1,100) do (
  19.         ping.exe %a%.%%m -n 1 -w 300 >nul&&Call :getname %a%.%%m
  20. )
  21. ———————————————————————————————————————————————————————————————
  22. cls
  23. start "" "在线计算机名-ip.txt"
  24. exit
  25. ———————————————————————————————————————————————————————————————
  26. cls
  27. :getname
  28. set iip=%1
  29. set nname=
  30. for /f "delims=" %%i in ('nbtstat -a !iip! ^| find /i "<00>  UNIQUE"') do (
  31. echo %%i
  32. set tii=%%i
  33. for /f "tokens=1 delims=< " %%j in ("!tii!") do echo %%j!aa!!iip!>>在线计算机名-ip.txt
  34. goto :aa
  35. )
  36. for /f "delims=" %%j in ('nbtstat -a !iip! ^| find /i "Host not found"') do (
  37. echo %%j
  38. echo !iip!>>在线计算机名-ip.txt
  39. )
  40. :aa
复制代码
txt文件列表格式如下:
  1. CB1 192.168.8.11
  2. CB2 192.168.8.12
  3. CB3 192.168.8.13
  4. CB4 192.168.8.14
  5. CB5 192.168.8.15
  6. CB6 192.168.8.16
  7. CB7 192.168.8.17
  8. CB8 192.168.8.7
  9. CB9 192.168.8.19
  10. CB10 192.168.8.20
  11. CB11 192.168.8.21
  12. CB12 192.168.8.22
  13. CB13 192.168.8.23
  14. ZWDD 192.168.8.33
  15. ZWJH1 192.168.8.31
  16. ZWJH2 192.168.8.32
  17. CBSbg1 192.168.8.38
  18. NYJH 192.168.8.40
  19. NYDD 192.168.8.42
  20. SKTSYLS 192.168.8.36
  21. gjsyls 192.168.8.35
  22. YSJH 192.168.8.41
  23. YSDD 192.168.8.39
  24. YB 192.168.8.37
  25. ZLCBS2 192.168.8.56
  26. zhs 192.168.8.43
  27. zhs1      192.168.8.44
  28. BZDD 192.168.8.77
复制代码

作者: ygqiang    时间: 2015-7-14 21:44

顶。。。。。。。。。
作者: ygqiang    时间: 2015-7-15 19:36

有人能帮忙解决下?谢谢。。
作者: ygqiang    时间: 2015-7-16 20:58

本帖最后由 ygqiang 于 2015-7-16 21:00 编辑

已经解决。。。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::获取本机ip
  4. for /f "tokens=1* delims=:" %%a in ('ipconfig ^| find /i "IP Address"') do (
  5.     ::获取本机ip前三段
  6.     for /f "tokens=1,2,3 delims=. " %%c in ("%%b") do set tip=%%c.%%d.%%e
  7. )
  8. echo;本机ip前三段%tip%
  9. del /f /q ip-new.txt
  10. ::ping系列ip
  11. for /l %%a in (2,1,150) do (
  12.         ::通的话调用getname
  13.         echo;%tip%.%%a
  14.         (ping %tip%.%%a -n 1 -w 300  | findstr /i "TTL=")&&Call :getname %tip%.%%a
  15. )
  16. exit
  17. pause&exit
  18. :getname
  19. ::获取ping通的ip对应的主机名
  20. for /f "tokens=1,* delims=^<" %%i in ('nbtstat -a %1^|find /i "<00>  UNIQUE"') do (
  21.     ::提取主机名
  22. set "newname=%%i"
  23. set "newname=!newname: =!"
  24. )
  25. echo;%1主机名!newname!
  26. ::查找Old_Name_IP.txt是否有该ip,有的话进行变量赋值
  27. set oldip=
  28. for /f "tokens=1*" %%m in ('findstr "%1\>" "ip-old.txt"') do (
  29.     set oldname=%%m
  30.     set oldip=%%n
  31. )
  32. echo;ip-old.txt是否存在!oldip!
  33. ::如果变量没有赋值,也就是Old_Name_IP.txt不存在该ip
  34. echo; "!newname!"   "!oldname!"
  35. if not defined oldip (
  36.     >>ip-new.txt echo;!newname!   %1
  37. ) else (
  38.     if "!newname!" neq "!oldname!" (>>ip-new.txt echo;!newname!   %1 )
  39. )
  40. ::返回ping
  41. 1pause
  42. goto :eof
复制代码

作者: ygqiang    时间: 2015-7-16 21:51

参考思路:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo,请输入你要查询的IP:
  4. set /p strIP=
  5. call :_CmpName !strIP! result
  6. echo,当前IP !strIP!,与保存记录查询结果为 : !result!
  7. pause
  8. goto :EOF
  9. :_CmpName
  10. (
  11. call :_GetNameByIP %1 strName
  12. echo,取得计算机名为 : !strName!
  13. call :_GetOldNameByIP %1 strOldName
  14. echo,保存计算机名为 : !strOldName!
  15. if "!strName!" EQU "!strOldName!" (set %2=一致) else (set %2=不一致)
  16. goto :EOF
  17. )
  18. :_GetNameByIP
  19. (
  20. REM echo,%%2 is : %2
  21. for /f "tokens=1,* delims=<" %%i in ('nbtstat -a %1^|findstr "<"') do (
  22. set "%2=%%i"
  23. set "%2=!%2: =!"
  24. goto :EOF
  25. )
  26. goto :EOF
  27. )
  28. :_GetOldNameByIP
  29. (
  30. REM echo,%%2 is : %2
  31. for /f "tokens=1,*" %%i in ('findstr "%1\>" 初始值.txt') do (
  32. set "%2=%%i"
  33. )
  34. goto :EOF
  35. )
复制代码
三个函数。

:_CmpName是主入口。
:_GetNameByIP是取得指定IP的计算机名。
:_GetOldNameByIP是取得保存文件里面的计算机名。


findstr /i IP 存储文件名 >nul && ()


把strIP改成你需要对比的IP就行。
下面几个函数基本上照抄。

先对比ip是否在txt文件里面存在。。存在的话,还要对比计算机名
只把GetOldNameByIP里面的对比文件改成真实的保存文件名就行了。




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