Board logo

标题: [文本处理] 【已解决】批处理如何提取ping命令响应时间最短的IP并将相关信息输出到hosts文件? [打印本页]

作者: ksla    时间: 2016-1-6 12:39     标题: 【已解决】批处理如何提取ping命令响应时间最短的IP并将相关信息输出到hosts文件?

本帖最后由 ksla 于 2016-1-6 22:22 编辑

运行下面脚本会生成一个ip.txt文件,内容为下方,原生生成的文件是根据ping ip的顺序排列的,想改成响应时间最少的IP排行到最下方!
-------------------上面的问题我已经折腾了一个的下午,到处抄一下,终于解决了,脚本已经达到我的目的了---------------------
---------------------但看着它觉得真的太样衰了,各位大大,能否帮忙将它优化一下---------------------


按ping ip顺序排列:
来自 1.1.1.1 的回复: 字节=32 时间=111ms TTL=55
来自 2.2.2.2 的回复: 字节=32 时间=11ms TTL=55
来自 3.3.3.3 的回复: 字节=32 时间=96ms TTL=55

改成按响应时间最少的值在最下方
来自 3.3.3.3 的回复: 字节=32 时间=111ms TTL=55
来自 1.1.1.1 的回复: 字节=32 时间=96ms TTL=55
来自 2.2.2.2 的回复: 字节=32 时间=11ms TTL=55
  1. @echo off & setlocal EnableDelayedExpansion
  2. ping 1.1.1.1 -n 1| find "来自">>ip.txt
  3. ping 2.2.2.2 -n 1| find "来自">>ip.txt
  4. ping 3.3.3.3 -n 1| find "来自">>ip.txt
  5. ping 4.4.4.4 -n 1| find "来自">>ip.txt
  6. if "%1"=="sub" (
  7.     for /f "tokens=1-6" %%a in (ip.txt) do (
  8.         set "s=          %%e"        
  9.         echo !s:~-10! %%a %%b %%c %%d %%f
  10.     )
  11.     exit
  12. ) else (
  13.     >ip2.txt ( for /f "tokens=1-6" %%a in ('cmd /c %0 sub ^| sort /r ') do echo %%b %%c %%d %%e %%a %%f)
  14. )
  15. for /f "tokens=2-15 delims= " %%i in (ip2.txt) do set zz=%%i
  16. echo %zz%
  17. findstr /e /v /r /c:"google.com" "C:\Windows\System32\drivers\etc\hosts">>hosts
  18. echo %zz% qq.com>>hosts
  19. echo %zz% aa.com>>hosts
  20. echo %zz% vv.com>>hosts
  21. echo %zz% nne.com>>hosts
  22. copy hosts "C:\Windows\System32\drivers\etc\hosts" /y
  23. del hosts /f  /q
  24. del ip.txt /f  /q
  25. del ip2.txt /f  /q
复制代码

作者: ksla    时间: 2016-1-6 16:46

顶顶顶.............................
作者: ksla    时间: 2016-1-6 16:55

顶顶顶.............................
作者: CrLf    时间: 2016-1-6 17:20

本帖最后由 CrLf 于 2016-1-6 19:46 编辑
  1. @mshta http://bathome.net/s/hta/?%random%^
  2.   type('ip.txt').split('\r\n')^
  3.   ._EACH(function(s){return {m:s.match(/时间=(\d+)ms/),s:s}})^
  4.   .sort(function(a,b){return b.m[1]-a.m[1]})^
  5.   ._EACH(function(o){return o.s})^
  6.   .join('\r\n') >ip.sort.txt
复制代码

作者: ksla    时间: 2016-1-6 17:42

回复 4# CrLf

    谢谢你的回答

    你的的代码,我运行不了,,

    我研究了一个下午已经弄好了,,虽然我弄得很丑,但起码能用了
作者: pcl_test    时间: 2016-1-6 18:31

本帖最后由 pcl_test 于 2016-1-12 02:46 编辑

水一发,提取最短响应时间
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "skip=1 tokens=1* delims=m" %%a in ('findstr "时间=" "%~f0"') do (
  4.     for /f "tokens=1-3 delims==" %%i in ("%%a") do (
  5.         for /f "tokens=2" %%x in ("%%i") do set #%%k=%%x
  6.         if not defined t (
  7.             set t=%%k
  8.         ) else if %%k leq !t! set t=%%k
  9.     )
  10. )
  11. echo;%t% !#%t%!
  12. pause&exit
  13. 来自 1.1.1.1 的回复: 字节=32 时间=111ms TTL=55
  14. 来自 2.2.2.2 的回复: 字节=32 时间=11ms TTL=55
  15. 来自 3.3.3.3 的回复: 字节=32 时间=96ms TTL=55
复制代码

作者: ksla    时间: 2016-1-6 19:02

回复 6# pcl_test


    靓仔版主能否将这个代码,完美的加进顶楼的代码里面!
作者: pcl_test    时间: 2016-1-6 19:05

回复 7# ksla

你都弄了一下午了,再弄个一晚上,也该可以完美了
作者: ksla    时间: 2016-1-6 19:07

回复 8# pcl_test


    下午不用睡,晚上要睡觉,你这样子,我只好一边哭去...
作者: WHY    时间: 2016-1-6 19:24

  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" == "sub" (
  3.     for /f "delims=" %%i in (IP.txt) do (
  4.         for /f "tokens=3 delims==m" %%j in ("%%i") do set "t=0000000000%%j"
  5.         echo;!t:~-10! %%i
  6.     )
  7. ) else (
  8.     for /f "tokens=1*" %%i in ('"%~f0" sub ^| sort') do echo;%%j
  9.     pause & exit
  10. )
复制代码

作者: ksla    时间: 2016-1-6 19:34

回复 10# WHY


    帅了一点!!
作者: ksla    时间: 2016-1-6 19:36

回复 8# pcl_test


    水一发PB -4

请问我又触犯了那条版规呢,,靓仔版主!
作者: CrLf    时间: 2016-1-6 19:46

回复 5# ksla


    已修改
作者: WHY    时间: 2016-1-6 20:34

本帖最后由 WHY 于 2016-1-6 22:49 编辑

回复 11# ksla

伤脑筋,我以为能帅好多点的
  1. @echo off & setlocal enabledelayedexpansion
  2. (for %%i in (1.1.1.1 2.2.2.2 3.3.3.3) do ping %%i -n 1)|find "来自">ip.txt
  3. set "Min=9999999999"
  4. for /f "tokens=2,7 delims==m " %%i in (IP.txt) do (
  5.     set "s=0000000000%%j"
  6.     set "s=!s:~-10!"
  7.     if "!s!" lss "!Min!" set "Min=!s!" & set "_!Min!=%%i"
  8. )
  9. (
  10.     findstr /e /v /r /c:"google.com" "%SystemRoot%\System32\drivers\etc\hosts"
  11.     echo !_%Min%! qq.com
  12.     echo !_%Min%! aa.com
  13.     echo !_%Min%! vv.com
  14. )>"%~dp0hosts"
  15. copy /y "%~dp0hosts" "%SystemRoot%\System32\drivers\etc\hosts"
  16. pause
复制代码

作者: ksla    时间: 2016-1-6 20:41

回复 14# WHY


    哥们,这次真的帅多了,但不能写入hosts
作者: ksla    时间: 2016-1-6 20:44

回复 14# WHY

:handshake :handshake :handshake :handshake :handshake

    越看你的代码越觉得你好利害!!
作者: ksla    时间: 2016-1-6 20:58

本帖最后由 ksla 于 2016-1-6 22:20 编辑

回复 14# WHY

非常感谢
作者: ksla    时间: 2016-1-6 21:30

本帖最后由 ksla 于 2016-1-6 22:20 编辑

回复 14# WHY


非常感谢
作者: gawk    时间: 2016-1-6 21:41

  1. sort -t "=" -k3,3 -n -r 1.txt > 2.txt
复制代码
使用 GNU 的 sort.exe 可以大大简化排序的代码
作者: ksla    时间: 2016-1-6 22:21

回复 19# gawk


    好的,,我研究一下!
作者: WHY    时间: 2016-1-6 22:35

回复 15# ksla


    14#改了,你再试下
move 不能写到hosts,那就copy好了
作者: ksla    时间: 2016-1-6 22:40

回复 21# WHY


    谢谢你!!




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