标题: [网络连接] 批处理如何将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 编辑
- @echo off
- setlocal enabledelayedexpansion
- set count=0
- set lost=0
- set totallost=10
-
- if exist temp.txt del temp.txt
- if exist temp1.txt del temp1.txt
- if exist lost.txt del lost.txt
- if exist offline.txt del offline.txt
-
-
- for /f "usebackq delims=" %%a in (ip.txt) do (
- echo %%a>temp.txt
-
- set /a count+=1
- set /p = !count!.
- set /p = No.!count! >>temp1.txt
-
- for /f "tokens= 1 delims= " %%i in (temp.txt) do set /p = %%i
- for /f "tokens= 1 delims= " %%i in (temp.txt) do set /p = "%%i " >>temp1.txt
-
- for /f "tokens= 2 delims= " %%i in (temp.txt) do set /p = "%%i "
- for /f "tokens= 2 delims= " %%i in (temp.txt) do set /p = "%%i " >>temp1.txt
-
- set b = %%a
-
- for /f "tokens=3 delims=," %%i in ('ping -n 1 "%b%"^|findstr /i "数据包 平均"') do set /p = "%%i "
- for /f "tokens=3 delims=," %%i in ('ping -n 1 "%b”^|findstr /i "数据包 平均"') do set /p = "%%i " >>temp1.txt
-
-
-
- echo. >>temp1.txt
- echo.
- echo.
-
- )<nul
-
-
- for /f "usebackq delims=" %%a in (temp1.txt) do (
-
- for /f "tokens=6 delims= " %%i in ('echo %%a^|findstr /i "丢失"') do (
- if %lost%==%%i echo %%a >> lost.txt rem 调试用,不正确
- if %totallost%==%%i echo %%a >> offline.txt rem 调试用,不正确
- )
-
- )<nul
复制代码
以上是我的程序,不知道为什么有时temp1.txt结果正确,有时就不正确。
新手上路,不太会用变量,只好不停地打开文件得到变量,执行效率非常低。
见笑了。
作者: xczxczxcz 时间: 2019-6-15 19:48
搞个Powershell 的给你玩玩。自己美化。或者??。- $IP =(gc IP.txt -ReadCount 0 -enc Default) | %{
- $ref = $_.Trim() -split '\s+';
- $index++;
- [PSCustomObject]@{
- index = $index;
- name = $ref[0];
- ip = $ref[1];
- }
- }
-
- $Lost = $offLine = $Latency = @();
- foreach($i in $IP)
- {
- Write-Host "正在测试连接 $($i.name) =$($i.ip)......" -NoNewline;
- $n =Test-Connection -Computer $i.ip -Count 10 -ErrorAction 'SilentlyContinue';
- $v =$n.ResponseTime | measure -Average -Maximum;
- if ($n.count -le 0) {
- $offLine +=$i.index.ToString()+' '+$i.name+' '+$i.ip;
- Write-Host '失败' -fore red;
- } else {
- if ($n.Count -lt 10) {
- $Lost +=$i.index.ToString()+' '+$i.name+' '+$i.ip+' '+(10-$n.Count).ToString()+' '+$v.Average+'ms';
- }
- foreach($a in $n.ResponseTime)
- {
- if ($a -gt 20){
- $Latency +=$i.index.ToString()+' '+$i.name+' '+$i.ip+' '+(10-$n.Count).ToString()+' '+$v.Maximum+'ms';
- break;
- }
- }
- Write-Host '完成' -fore Green
- }
- }
-
- if ($Lost) { sc ".\Lost.txt" -Value $Lost -Force -enc Default };
- if ($offLine) { sc ".\offLine.txt" -Value $offLine -Force -enc Default };
- 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
- @echo off
- set info=互助互利,支付宝扫码头像,感谢赞助
- rem 有问题,可加QQ956535081及时沟通
- title %info%
- cd /d "%~dp0"
- set "文本=IP.txt"
- set 响应时间=20
- set 数据包=10
- set 进程=5
- set "结果1=lost.txt"
- set "结果2=offline.txt"
- set "结果3=latency.txt"
- set "结果4=ok.txt"
- del /a /f /q "%结果1%" "%结果2%" "%结果3%" "%结果4%" 2>nul
- set "folder=%tmp%\log"
- rd /s /q "%folder%\" 2>nul
- md "%folder%\" 2>nul
- for /f "tokens=1,2* delims=: " %%a in ('type "%文本%"^|findstr /n .') do (
- echo;%%a %%b %%c
- set s=%%a
- (echo;@echo off
- echo;setlocal enabledelayedexpansion
- echo;title _@#@_["%%a %%b %%c"]
- echo;^>"%%tmp%%\#%%a.log" ping /n %数据包% %%c
- echo;for /f %%%%i in ^('type "%%tmp%%\#%%a.log"^^^|find /i /c "ttl="'^) do set n=%%%%i
- echo;if %%n%% equ 0 ^(
- echo; ^>"%folder%\#%%a.log" echo;2^^^|%%a %%b %%c
- echo;^) else ^(
- echo; for /f "tokens=3 delims=," %%%%i in ^('findstr /rc:"丢失 = [0-9]" "%%tmp%%\#%%a.log"'^) do set lost=%%%%i
- echo; for /f "tokens=3 delims=," %%%%i in ^('findstr /rc:"平均 = [0-9]" "%%tmp%%\#%%a.log"'^) do set average=%%%%i
- echo; if %%n%% lss %数据包% ^(
- echo; ^>"%folder%\#%%a.log" echo;1^^^|%%a %%b %%c ^!lost^! ^!average^!
- echo; ^) else ^(
- echo; for /f "tokens=3 delims=m " %%%%i in ^("!average!"^) do (
- echo; if %%%%i gtr %响应时间% ^(
- echo; ^>"%folder%\#%%a.log" echo;3^^^|%%a %%b %%c ^!lost^! ^!average^!
- echo; ^) else ^(^>"%folder%\#%%a.log" echo;4^^^|%%a %%b %%c ^!lost^! ^!average^!^)
- echo; ^)
- echo; ^)
- echo;^)
- echo;exit)>"%tmp%\#%%a.bat"
- start /min "" "%tmp%\#%%a.bat"
- call :circl
- )
- :wait
- tasklist /fi "IMAGENAME eq cmd.exe" /V /FO CSV|>nul find /i /c "_@#@_"&&(>nul ping /n 2 0 & goto wait)
- cls
- setlocal enabledelayedexpansion
- for /l %%a in (1 1 %s%) do (
- if exist "%folder%\#%%a.log" (
- for /f "tokens=1* delims=|" %%b in ('type "%folder%\#%%a.log"') do (
- >>"!结果%%b!" echo;%%c
- if %%b neq 4 (echo;%%c)
- )
- )
- )
- endlocal
- echo;%info%
- pause
- exit
- :circl
- set cout=0
- >nul ping /n 1 0
- for /f %%a in ('tasklist /fi "IMAGENAME eq cmd.exe" /V /FO CSV^|find /i /c "_@#@_"') do set cout=%%a
- title %info% - 当前进程数[%cout%]
- if %cout% geq %进程% (goto :circl)
- 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中每行第二列作为地址,为什么不行?- ...
-
- for /f "tokens=1,2 delims=" %%a in (ip.txt) do (
- for /f "tokens=3 delims=," %%i in ('ping -n 10 %%b^|findstr /i "数据包 平均"') do (
- set /p = "%%i "
- set /p = "%%i ">>result.txt
- )
-
- echo. >>result.txt
- ...
-
- )<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 - ...
-
- for /f "tokens=1,2 delims= " %%a in (ip.txt) do (
- for /f "tokens=3 delims=," %%i in ('ping -n 10 %%b^|findstr /i "数据包 平均"') do (
- set /p = "%%i "
- set /p = "%%i ">>result.txt
- )
-
- echo. >>result.txt
- ...
-
- )<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 |