我查看了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 ;.) 但对我来说,这一切都是全新的。
答案 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
我们只需要前两个令牌,即This
和String
。 echo %%a
将返回This
,echo %%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进行过滤,因为如果要跳过的行在每种情况下都相同(响应地址与无响应地址),您永远无法确定