Board logo

标题: [网络连接] 批处理如何将ping不通、丢包的IP地址写入不同的文件? [打印本页]

作者: bigjohn    时间: 2019-6-15 17:33     标题: 批处理如何将ping不通、丢包的IP地址写入不同的文件?

文件IP.txt 内容如:
百度 www.baidu.com
搜狐 www.sohu.com
主机1 192.168.0.1
主机2 192.168.1.1
...

打开IP.txt文件,每一个地址ping 10次。
如果有丢包的ip地址 写入文件lost.txt;
如果全部ping不通,写入文件offline.txt;
将延迟超过20ms,写入文件latency.txt。

rem: 写入lost.txt和latency.txt文件格式为:序号. 主机名  IP地址 丢包 平均时延
rem: 写入offline.txt文件格式:序号. 主机名 IP地址


新手上路,请多多指教。
作者: bigjohn    时间: 2019-6-15 17:39

本帖最后由 bigjohn 于 2019-6-15 17:58 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set count=0
  4. set lost=0
  5. set totallost=10
  6. if exist temp.txt del temp.txt
  7. if exist temp1.txt del temp1.txt
  8. if exist lost.txt del lost.txt
  9. if exist offline.txt del offline.txt
  10. for /f "usebackq delims=" %%a in (ip.txt)  do (
  11.     echo %%a>temp.txt
  12.    
  13.     set /a count+=1
  14.     set /p = !count!.  
  15.     set /p = No.!count!  >>temp1.txt
  16.    
  17.     for /f "tokens= 1 delims= " %%i in (temp.txt)   do  set /p =  %%i
  18.     for /f "tokens= 1 delims= " %%i in (temp.txt)   do  set /p = "%%i  " >>temp1.txt
  19.     for /f "tokens= 2 delims= " %%i in (temp.txt)   do  set /p = "%%i  "
  20.     for /f "tokens= 2 delims= " %%i in (temp.txt)   do  set /p = "%%i  " >>temp1.txt
  21.    
  22.     set b = %%a
  23.         
  24.     for /f "tokens=3 delims=," %%i in ('ping -n 1 "%b%"^|findstr /i "数据包  平均"') do set /p = "%%i  "
  25.     for /f "tokens=3 delims=," %%i in ('ping -n 1 "%b”^|findstr /i "数据包  平均"') do set /p = "%%i  " >>temp1.txt  
  26.    
  27.     echo. >>temp1.txt
  28.     echo.
  29.     echo.
  30. )<nul
  31. for /f "usebackq delims=" %%a in (temp1.txt) do (
  32.       
  33.     for /f "tokens=6 delims= " %%i in ('echo %%a^|findstr /i "丢失"')  do (   
  34.     if %lost%==%%i  echo %%a >> lost.txt  rem 调试用,不正确
  35.     if %totallost%==%%i  echo %%a >> offline.txt rem 调试用,不正确
  36.     )
  37. )<nul
复制代码
以上是我的程序,不知道为什么有时temp1.txt结果正确,有时就不正确。
新手上路,不太会用变量,只好不停地打开文件得到变量,执行效率非常低。
见笑了。
作者: xczxczxcz    时间: 2019-6-15 19:48

搞个Powershell 的给你玩玩。自己美化。或者??。
  1. $IP =(gc IP.txt -ReadCount 0 -enc Default) | %{
  2. $ref = $_.Trim() -split '\s+';
  3. $index++;
  4. [PSCustomObject]@{
  5. index = $index;
  6. name = $ref[0];
  7. ip = $ref[1];
  8. }
  9. }
  10. $Lost = $offLine = $Latency = @();
  11. foreach($i in $IP)
  12. {
  13. Write-Host "正在测试连接 $($i.name) =$($i.ip)......" -NoNewline;
  14. $n =Test-Connection -Computer $i.ip -Count 10 -ErrorAction 'SilentlyContinue';
  15. $v =$n.ResponseTime | measure -Average -Maximum;
  16. if ($n.count -le 0) {
  17. $offLine +=$i.index.ToString()+' '+$i.name+' '+$i.ip;
  18. Write-Host '失败' -fore red;
  19. } else {
  20. if ($n.Count -lt 10) {
  21. $Lost +=$i.index.ToString()+' '+$i.name+' '+$i.ip+' '+(10-$n.Count).ToString()+' '+$v.Average+'ms';
  22. }
  23. foreach($a in $n.ResponseTime)
  24. {
  25. if ($a -gt 20){
  26. $Latency +=$i.index.ToString()+' '+$i.name+' '+$i.ip+' '+(10-$n.Count).ToString()+' '+$v.Maximum+'ms';
  27. break;
  28. }
  29. }
  30. Write-Host '完成' -fore Green
  31. }
  32. }
  33. if ($Lost) { sc ".\Lost.txt" -Value $Lost -Force -enc Default };
  34. if ($offLine) { sc ".\offLine.txt" -Value $offLine -Force -enc Default };
  35. if ($Latency) { sc ".\Latency.txt" -Value $Latency -Force -enc Default };
复制代码

作者: bigjohn    时间: 2019-6-15 21:04

回复 3# xczxczxcz


    感谢! 我得好好研究一下。
作者: bigjohn    时间: 2019-6-15 21:31

本帖最后由 bigjohn 于 2019-6-15 21:40 编辑

回复 3# xczxczxcz


    Get-Content : 无法绑定参数“Encoding”。由于枚举值无效,无法将值“Default”转换为类型“Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding”。请指定以下枚举值之一,然后重试。可能的枚举值为“Unknown、String、Unicode、Byte、BigEndianUnicode、UTF8、UTF7、Ascii
”。
所在位置 行:1 字符: 34
+ $IP =(gc IP.txt -ReadCount 0 -enc <<<<  Default) | %{
    + CategoryInfo          : InvalidArgument: ( [Get-Content], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetContentCommand

正在测试连接  =......Test-Connection : 无法对参数“ComputerName”执行参数验证。该参数为 Null 或为空。请提供一个不为 Null 或不为空的参数,然后重试此命令。
所在位置 行:15 字符: 31
+     $n =Test-Connection -Computer <<<<  $i.ip -Count 10 -ErrorAction 'SilentlyContinue';
    + CategoryInfo          : InvalidData: (:) [Test-Connection], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.TestConnectionCommand

不能对值为空的表达式调用方法。
所在位置 行:18 字符: 31
+         $offLine +=$i.index.ToString <<<< ()+' '+$i.name+' '+$i.ip;
    + CategoryInfo          : InvalidOperation: (ToString:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

失败

还是得好好请教大神,感觉像天书呀。非常佩服,这么快就编写好了。
我的电脑是win7 sp1 ,用自带powershell_ise 运行显示以上错误。
麻烦看看是什么原因?  多谢了。
作者: bigjohn    时间: 2019-6-15 21:48

回复 4# bigjohn


我对 powershell一窍不通,别笑话。
恳求占用你宝贵时间帮我按我的要求写一个程序吧。


多谢了。
作者: zaqmlp    时间: 2019-6-16 00:47

  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. cd /d "%~dp0"
  6. set "文本=IP.txt"
  7. set 响应时间=20
  8. set 数据包=10
  9. set 进程=5
  10. set "结果1=lost.txt"
  11. set "结果2=offline.txt"
  12. set "结果3=latency.txt"
  13. set "结果4=ok.txt"
  14. del /a /f /q "%结果1%" "%结果2%" "%结果3%" "%结果4%" 2>nul
  15. set "folder=%tmp%\log"
  16. rd /s /q "%folder%\" 2>nul
  17. md "%folder%\" 2>nul
  18. for /f "tokens=1,2* delims=: " %%a in ('type "%文本%"^|findstr /n .') do (
  19.     echo;%%a %%b %%c
  20.     set s=%%a
  21.     (echo;@echo off
  22.     echo;setlocal enabledelayedexpansion
  23.     echo;title _@#@_["%%a %%b %%c"]
  24.     echo;^>"%%tmp%%\#%%a.log" ping /n %数据包% %%c
  25.     echo;for /f %%%%i in ^('type "%%tmp%%\#%%a.log"^^^|find /i /c "ttl="'^) do set n=%%%%i
  26.     echo;if %%n%% equ 0 ^(
  27.     echo;    ^>"%folder%\#%%a.log" echo;2^^^|%%a %%b %%c
  28.     echo;^) else ^(
  29.     echo;    for /f "tokens=3 delims=," %%%%i in ^('findstr /rc:"丢失 = [0-9]" "%%tmp%%\#%%a.log"'^) do set lost=%%%%i
  30.     echo;    for /f "tokens=3 delims=," %%%%i in ^('findstr /rc:"平均 = [0-9]" "%%tmp%%\#%%a.log"'^) do set average=%%%%i
  31.     echo;    if %%n%% lss %数据包% ^(
  32.     echo;        ^>"%folder%\#%%a.log" echo;1^^^|%%a %%b %%c ^!lost^! ^!average^!
  33.     echo;    ^) else ^(
  34.     echo;           for /f "tokens=3 delims=m " %%%%i in ^("!average!"^) do (
  35.     echo;               if %%%%i gtr %响应时间% ^(
  36.     echo;                   ^>"%folder%\#%%a.log" echo;3^^^|%%a %%b %%c ^!lost^! ^!average^!
  37.     echo;               ^) else ^(^>"%folder%\#%%a.log" echo;4^^^|%%a %%b %%c ^!lost^! ^!average^!^)
  38.     echo;           ^)
  39.     echo;    ^)  
  40.     echo;^)
  41.     echo;exit)>"%tmp%\#%%a.bat"
  42.     start /min "" "%tmp%\#%%a.bat"
  43.     call :circl
  44. )
  45. :wait
  46. tasklist /fi "IMAGENAME eq cmd.exe" /V /FO CSV|>nul find /i /c "_@#@_"&&(>nul ping /n 2 0 & goto wait)
  47. cls
  48. setlocal enabledelayedexpansion
  49. for /l %%a in (1 1 %s%) do (
  50.     if exist "%folder%\#%%a.log" (
  51.         for /f "tokens=1* delims=|" %%b in ('type "%folder%\#%%a.log"') do (
  52.             >>"!结果%%b!" echo;%%c
  53.             if %%b neq 4 (echo;%%c)
  54.         )
  55.     )
  56. )
  57. endlocal
  58. echo;%info%
  59. pause
  60. exit
  61. :circl
  62. set cout=0
  63. >nul ping /n 1 0
  64. for /f %%a in ('tasklist /fi "IMAGENAME eq cmd.exe" /V /FO CSV^|find /i /c "_@#@_"') do set cout=%%a
  65. title %info% - 当前进程数[%cout%]
  66. if %cout% geq %进程% (goto :circl)
  67. goto :eof
复制代码

作者: xczxczxcz    时间: 2019-6-16 09:15

回复 5# bigjohn

这个报错是 脚本 找不到 IP.txt 在哪里 ,导致后面的参数值为空值。
请确保你的 系统已正常激活 POWERSHELL。 偶们一般不用 ISE. 你现在用的是ISE。那就说一下ISE操作。【打开 ISE ,然后在下面的蓝底命令行窗口 输入中括号内的具体内容:[cd "你入IP.txt的文件夹完整路径“]。如 cd c:\temp\test 回车。再把脚本内容粘贴进去,回车运行就可以了。

当然你也可以把脚本中的 IP.TXT 改文件的绝对路径。 以及最后三行中的 .\xxx.txt 输出文件 也改成绝对路径。然后就是直接复制粘贴运行。
作者: bigjohn    时间: 2019-6-16 11:12

回复 8# xczxczxcz


    展开运算符“@”无法用于在表达式中引用变量。“@echo”只能用作命令的参数。若要在表达式中引用变量,请使用“$echo”。
At line:1 char:1

关键字“for”后缺少左括号“(”。
At line:18 char:5

表达式中缺少右括号“)”。
At line:19 char:9

“for”语句中的表达式后缺少右括号“)”。
At line:21 char:5

for 循环中缺少语句体。
At line:21 char:5

表达式中缺少右括号“)”。
At line:21 char:10

展开运算符“@”无法用于在表达式中引用变量。“@echo”只能用作命令的参数。若要在表达式中引用变量,请使用“$echo”。
At line:21 char:11

关键字“for”后缺少左括号“(”。
At line:25 char:14

表达式或语句中出现意外标记“^”。
At line:25 char:74

表达式中缺少右括号“)”。
At line:27 char:9

“for”语句中的表达式后缺少右括号“)”。
At line:27 char:9

for 循环中缺少语句体。
At line:27 char:9

表达式或语句中出现意外标记“^^^”。
At line:27 char:42

不允许使用空管道元素。
At line:27 char:45

表达式或语句中出现意外标记“)”。
At line:28 char:11

改变目录后还是报错。 给你填麻烦了。
作者: bigjohn    时间: 2019-6-16 12:29     标题: 请教批处理为什么不能ping ?

IP.txt 数据格式为:
百度 www.baidu.com
搜狐 www.sohu.com
测试 192.168.1.1

读取文件ip.txt中每行第二列作为地址,为什么不行?
  1. ...
  2. for /f "tokens=1,2 delims=" %%a in (ip.txt)  do (
  3.     for /f "tokens=3 delims=," %%i in ('ping -n 10 %%b^|findstr /i "数据包  平均"') do (
  4.        set /p = "%%i  "
  5.        set /p = "%%i  ">>result.txt
  6.      )
  7.     echo. >>result.txt
  8. ...
  9. )<nul
复制代码

作者: miqilaosu    时间: 2019-6-16 13:12

本帖最后由 miqilaosu 于 2019-6-16 13:17 编辑

回复 1# bigjohn


    for /f "tokens=1,2 delims= " %%a in (ip.txt)  do (
=后边接分割符
作者: xczxczxcz    时间: 2019-6-16 13:44

回复 9# bigjohn


    你用的是什么脚本?什么@???
作者: bigjohn    时间: 2019-6-16 13:54

回复 2# miqilaosu


    还是不太懂,麻烦直接改一下以上程序吧。多谢了
作者: miqilaosu    时间: 2019-6-16 14:53

本帖最后由 miqilaosu 于 2019-6-16 14:59 编辑

回复 3# bigjohn
  1. ...
  2. for /f "tokens=1,2 delims= " %%a in (ip.txt)  do (
  3.     for /f "tokens=3 delims=," %%i in ('ping -n 10 %%b^|findstr /i "数据包  平均"') do (
  4.        set /p = "%%i  "
  5.        set /p = "%%i  ">>result.txt
  6.      )
  7.     echo. >>result.txt
  8. ...
  9. )<nul
复制代码
你看下我的等于号和你的后边有什么区别,第三行,是不是多了一个空格,因为是用空格作分割符的,就像第4行你是以,号做为分割符一样的原理,代表列与列之前用什么分割
作者: bigjohn    时间: 2019-6-16 21:53

回复 12# xczxczxcz


    程序Ok。我搞错了,用powershell了。多谢。
作者: bigjohn    时间: 2019-6-16 21:53

回复 14# miqilaosu


    可以了。多谢!




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