[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]统计ping的返回信息的批处理代码怎么老提示"此时不应有delims"?

本帖最后由 gmwd18 于 2012-2-28 17:38 编辑

下面是小弟最近写的一个统计ping的返回信息的一个批处理中的一段代码,但是运行后总是提示此时不应有delims,我找不出原因,
请各位大大帮忙看下,不胜感谢!
先说明一下,ip.txt里面是存放的要ping的ip,ip的存放格式为 地名:ip地址,每个ip 一行;\request文件夹下存放的是以Ip地址命名的txt文件,每个文件里面是ping的返回信息,
第二个for那里的\<统计信息\>是为了匹配ping返回信息里的字符串,因为我的系统是win7中文版,现在我想统计一下每个ip的丢包率,代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=: tokens=1,2" %%e in (%~dp0\ipinfo\ip.txt) do (
  4. set rep=%%e
  5. set repo=%%f
  6. echo !repo!
  7.      for /f  "delims=:"  %%g  in  ('findstr /n "\<统计信息\>"  "%~dp0\request\!repo!.txt"') do (
  8. set cou=%%g
  9. echo !cou!
  10.         for /f  "skip=%cou% delims=: tokens=2" %%h  in (%~dp0\request\!repo!.txt) do (
  11. set  str=%%h
  12. set  str=!str:~-9,-1!
  13. echo !str!
  14. )))
  15. pause
复制代码
现在就是第三个for 执行不下去,总提示此时不应有delims,我找不出哪里错了,请大家帮忙看看,谢谢了!

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=: tokens=1,2" %%e in (%~dp0\ipinfo\ip.txt) do (
  4.     set rep=%%e
  5.     set repo=%%f
  6.     echo !repo!
  7.     for /f  "delims=:" %%g in ('findstr /n "\<统计信息\>" "%~dp0\request\!repo!.txt"') do (
  8.         set cou=%%g
  9.         echo !cou!
  10.         call :sub !cou!
  11.     )
  12. )
  13. pause
  14. goto :eof
  15. :sub
  16. for /f  "skip=%1 delims=: tokens=2" %%h in (%~dp0\request\!repo!.txt) do (
  17.     set str=%%h
  18.     set str=!str:~-9,-1!
  19.     echo !str!
  20. )
复制代码

TOP

变量延迟 与 for的运行机制 不是那么简单。

只是“统计一下每个ip的丢包率”的话,不需要那么复杂:
  1. @echo off
  2. for /f "tokens=1,3 delims=:" %%a in ('findstr.exe 丢失 request\*.txt') do (
  3.     echo %%~na %%b
  4. )
  5. pause
复制代码

TOP

问题源于
  1. for /f  "skip=%cou% delims=: tokens=2" %%h  in
复制代码
这一句中,%cou% 在预处理时是空变量致错。
楼主应该摆脱两个误区:
  1. 首先,%cou% 这种类型的变量是最先被扩展的,它的优先级在解释、划分语句之前,如果想在解释语法之后、执行语句之前将变量扩展,请使用变量延迟,这是基础,一定要掌握的。
  2. 其次,for 的参数在预处理之前就必须给定,循环之中无法改变,这个也许比较难明白,不过你写多了代码自然能感觉得到冥冥之中有这么一个规则存在...
复制代码

TOP

同上。  赞同skip参数不能有变量来代替,  就连delims也不能。
莫求昨天无悔,但愿今日无愧。

TOP

回复 4# CrLf

一语中地阿,让我这个菜鸟受教学习了,问题解决了,再次感谢!

TOP

回复 3# powerbat


    确实如此,已经根据你的意见修改了代码,谢谢了!

TOP

再次感谢楼上的各位高手的帮助,谢谢你们,问题解决了~

TOP

回复 5# guaiwu


2楼那种写法算不算变量呢?

TOP

回复 9# find


2楼的命令....   也许是小弟肤浅。    同求真谛
莫求昨天无悔,但愿今日无愧。

TOP

返回列表