cmd脚本用于ping查找平均值,丢失率和IP

时间:2017-06-20 10:59:00

标签: windows batch-file cmd

我查看了stackoverflow,发现了几个类似的主题机器人,他们中没有一个人没有关于cmd 问题是: 我有一个网站,例如route4me.com,我需要ping它并保存到文件中:IP,%损失和平均时间 任何人都可以解释如何使用tockens和delim,因为我是总的菜鸟。 找到一篇文章,解释如何:

  

让我们仔细看看PING命令的输出:

     

我们希望第一行(未知)第二个单词(实际上是   第二行,因为第一行是空白的)第一行包含   方括号[10.100.0.14]无括号中的(已知)IP地址   其他行包含方括号中的IP地址,   方括号中没有任何其他字符串首先标记(黄色   突出显示所请求单词REMOTE_PC的边界:

     

使用32字节数据对REMOTE_PC [10.100.0.14]进行Ping操作:

     

来自10.100.0.14的回复:bytes = 32 time< 10ms TTL = 128

     

10.100.0.14的Ping统计信息:数据包:已发送= 4,已接收= 4,   丢失= 0(0%损失),以毫秒为单位的近似往返时间:     最小值= 0ms,最大值= 0ms,平均值= 0ms这是我们的选择   对于分隔符,delims,非常明显:一个空间。如果我们标记(黄色   突出显示所有空格,我们可以很容易地看到哪些令牌可用:

     

使用32字节数据对REMOTE_PC [10.100.0.14]进行Ping操作:

     

token = 1 token = 2 token = 3 4 5 6 7 8在这种情况下,   我们只对代币2和3感兴趣:

     

令牌2是请求的计算机名称令牌3,可用于检查是否   我们正在处理正确的行:它应该等于我们原来的IP   括号括在方括号中所以我们只对...感兴趣   代币2和3:

     

使用32字节数据对REMOTE_PC [10.100.0.14]进行Ping操作:

     token=2     token=3 This leads us to the following command line:
     

FOR / F"令牌= 2,3 delims =" %% A IN(' PING -a%1')DO IF" %% B" ==" [%1]"   SET PC = %% A%1是传递的第一个命令行参数的值   到我们的批处理文件。在我们的例子中,要调查的IP地址。

     

IF" %% B" ==" [%1]"检查第三个单词(标记= 3)是否等于   原始IP地址(%1)括在方括号([%1])中。要是我们   要跳过这个测试,令牌2的最终结果将是相等的   从最后一行开始的符号(=)(只是尝试一下)。如果测试匹配,则   第二个单词(标记= 2)存储在名为PC的变量中。

     

请注意,指定的第一个标记(标记2)存储在   变量指定(%% A),并指定以下标记(标记3)   在以下变量中(在这种情况下:%% B)。

     

到目前为止我们的批处理文件:

     

@ECHO OFF FOR / F"令牌= 2,3 delims =" %% A IN(' PING -a%1')DO IF   " %% B" ==" [%1]" SET PC = %% A SET PC最后一行SET PC显示   变量PC的实际值。我添加它用于调试目的。   (实际上,SET PC将显示名称以其开头的所有变量   " PC&#34 ;.)   但对我来说,这一切都是全新的。

2 个答案:

答案 0 :(得分:0)

让我们打破这一点。

基本上,标记是字符串的一部分,delims(分隔符)是分隔标记的文本。考虑这个例子:

set str=This.String.Is.Separated.By.Fullstops

for /f "tokens=1,2 delims=." %%a in ("%str%") do echo %%a %%b

for循环会将文字与.分开,现在文字的格式如下:

Tokens: 1    2      3  4         5  6
Text  : This String Is Separated By Fullstops

我们只需要前两个令牌,即ThisStringecho %%a将返回Thisecho %%b将返回String。但echo %%c不会返回Is,因为for循环只处理前"tokens=1,2中所述的前两个令牌。

返回for循环。

FOR /F "tokens=2,3 delims= " %%A IN ('PING -a %1') DO IF "%%B"=="[%1]" SET PC=%%A

这次,for循环只获得命令PING -a %1的结果。结果将是:

 Tokens: 1       2         3             4    5  6     7  8

 Text  : Pinging REMOTE_PC [10.100.0.14] with 32 bytes of data:

我们只接受2nd令牌。请记住,即使令牌2似乎不是%%A,但由于在令牌设置中,我们已将第一个输出变量设置为带有第二个令牌的文本。

IF语句检查第二个输出变量是否带有令牌3,即:

[10.100.0.14]

,这等于第一个命令行参数。如果是,则将PC设置为带有令牌1的变量,即REMOTE_PC,即您的PC名称。

为了获得您需要的信息,我们将引入另一个名为skip的设置。Skip定义要跳过的行数,并读取其后的行。

for /f "tokens=11 skip=8 delims= " %%a in ('ping -a google.com') do echo %%a

这应该可以获得损失百分比(可能不是因为我不能在我的电脑上使用俄语。)随意调整它并让它适合你。

答案 1 :(得分:0)

@echo off
setlocal
call :get route4me.com
call :get microsoft.com
call :get google.com
goto :eof
:get
REM set a default value for 'avrg':
set "avrg= ---"
REM do the ping one time...:
>temp ping %1
REM ... and process the output several times to collect the data:
for /f "tokens=2 delims=[]" %%a in (temp) do set "ip=%%a"
for /f "tokens=1 delims=( " %%a in ('find "(" temp') do set "loss=%%a"
for /f "tokens=4 delims==" %%a in ('find "ms, " temp') do set "avrg=%%a"
echo %1,%ip%,%loss%,%avrg:~1%

第一个for循环获取IP 只有一行包含[],因此我们可以安全地处理整行,而不会覆盖我们的结果(没有其他行会有token 2)。

第二个for循环获得损失百分比 它是唯一包含()的行,但这一次,我们必须使用token 1.所以下一行会破坏我们的令牌。因此我们使用find仅过滤此行(每行都有第一个标记)。

第三个for循环得到平均值 同样,我们需要对该行进行过滤(我使用ms,,希望它是国际的;其他两个应该适用于所有语言)
如果没有这样的行,则令牌保持为空,因此set将不会执行,并保留默认值。
(试图保持语言独立性也是仅在最后=循环中分隔符for的原因,之后用%avrg:~1%删除空格

使用临时文件并不能使它更快(一次ping而不是三次),但也能确保数据一致(从同一ping命令获取所有值)。

我更喜欢通过skip ping进行过滤,因为如果要跳过的行在每种情况下都相同(响应地址与无响应地址),您永远无法确定