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

【已结】批处理如何生成多行多列文件

请教一个bat问题,请高手指教~!批处理入如下:
FOR /F %%i IN (D:\www.txt) DO (FOR /F %%j IN (D:\dnsip.txt) DO (FOR /L %%a IN (1,1,3) DO dig @%%j %%i | find  "time" >>d:\dns-result\%%j%%i.txt))
我想做个批处理,生成一个文件,多行多列的,上面是我写的程序,不知道怎么改了,我目前只能生成多个文件,
www.txt内容如下:
www.yahoo.com.cn
www.chinatelecom.com.cn
www.163.com
www.taobao.com
www.baidu.com.cn
www.17173.com
www.sohu.com
www.xinhuanet.com
www.qq.com
www.sina.com.cn
www.tom.com
dnsip.txt内容如下:
1.1.1.1
2.2.2.2
3.3.3.3
我想得到的效果如下:
                                              1.1.1.1                  2.2.2.2           3.3.3.3
www.yahoo.com.cn                 132 msec         140 msec          144 msec
www.chinatelecom.com.cn      134 msec         140 msec          145 msec      
www.163.com                          142 msec         141 msec          143 msec
www.taobao.com                     140 msec         140 msec          143 msec
有高人指点一下么?
xxx msec 为dig * | find time的结果
搜索更多相关主题的帖子: bat 高手 指教

感谢各位的热心帮助~从这里面也学到了不少知识,我最终使用批处理如下:
@echo off&setlocal enabledelayedexpansion
cd.>result.txt
for /f "delims=" %%i in (dnsip.txt) do (
   if not defined str (
     set "str=                        %%i"&set /p=!str!<nul>result.txt)else (
       set /p=     %%i<nul>>result.txt
))
  for /f %%i in (www.txt) do (
     echo.>>result.txt
       set "str=%%i               "
         set /p=!str:~,25!<nul>>result.txt
           for /f %%j in (dnsip.txt) do (
             for /l %%a in (1 1 50) do (
             for /f "tokens=3 delims=:; " %%k in ('dig @%%j %%i^|find "time"') do (
               echo 正在执行 %%j的第 %%a 次  %%k msec %%i
               set/a var+=%%k,n+=1
              )
            )
          set/a var/=n
        set "var=!var! msec            "
      set /p=!var:~,20! <nul>>result.txt
      set "var="&set "n="
    )
  )
pause

TOP

楼主用你自己的方法和这个方法比较下,哪个执行比较快啊。速度相差很多吗?我觉得是dig.exe本身的程序问题,每dig一次,从开始请求到答复需要一个过程,此代码每循环一次向服务器请求33次,循环50次,就上千次了。所以是很耗时间的。就好像ping一样,原本是用来检测网络连接,但每发送一次消息到接受一次消息是有时间差的,所以可以用ping -n X 127.1>nul来延时,类似的,也可以用dig 1.1.1.1 www.baidu.com>nul来延时。

TOP

原帖由 in2bat 于 2008-12-29 09:10 发表
楼上的是dig一次的结果,我想要的是dig 50次或者100次的平均值的结果。

加个for 怎么样 速度方面总要一次一次过啊
  1. @echo off&setlocal enabledelayedexpansion
  2. cd.>result.txt
  3. for /f "delims=" %%i in (dnsip.txt) do (
  4.    if not defined str (
  5.      set "str=                        %%i"&set /p=!str!<nul>result.txt)else (
  6.        set /p=     %%i<nul>>result.txt
  7. ))
  8.   for /f %%i in (www.txt) do (
  9.      echo.>>result.txt
  10.        set "str=%%i               "
  11.          set /p=!str:~,25!<nul>>result.txt
  12.            for /f %%j in (dnsip.txt) do (
  13.              for /l %%a in (1 1 25) do (
  14.              for /f "tokens=3 delims=:; " %%k in ('dig %%j %%i^|find "time"') do (
  15.                set/a var+=%%k,n+=1
  16.               )
  17.             )
  18.           set/a var/=n
  19.         set "var=!var! msec            "
  20.       set /p=!var:~,20! <nul>>result.txt
  21.       set "var="&set "n="
  22.     )
  23.   )
  24. pause
复制代码

TOP

我感觉我们研究的方法执行速度很慢,是不是代码不够优化呢?有想法的话,可以一起探讨一下。

TOP

楼上的是dig一次的结果,我想要的是dig 50次或者100次的平均值的结果。

TOP

就你们在讨论?
下面这样行不?
  1. @echo off&setlocal enabledelayedexpansion
  2. cd.>result.txt
  3. for /f "delims=" %%i in (dnsip.txt) do (
  4.    if not defined str (
  5.      set "str=                        %%i"&set /p=!str!<nul>result.txt)else (
  6.        set /p=     %%i<nul>>result.txt
  7. ))
  8.   for /f %%i in (www.txt) do (
  9.      echo.>>result.txt
  10.        set "str=%%i               "
  11.          set /p=!str:~,25!<nul>>result.txt
  12.            for /f %%j in (dnsip.txt) do (
  13.              for /f "tokens=2 delims=:;" %%k in ('dig %%j %%i^|find "time"') do (
  14.                set "var=%%k            "
  15.              )
  16.              set /p=!var:~,20!<nul>>result.txt
  17.           )
  18.        )
  19. pause
复制代码

TOP

唉,我也晕了。一下反应过来,eol默认是忽略;开头的行,所以只要把eol随便赋予一个不是;的值就行,所以
for /f "eol= tokens=4 delims= " %%k in ('dig @%%j %%i^|find "time"') do (
               set /p=%%k     <nul>>result.txt
)
只要不是;都可以。

TOP

咦,是啊。奇怪,eol=: 就可以了,我还得好好思考下,不用向我学习啊,我也在不断学习,一起学习吧。

TOP

我用的是冒号,缺省是分好,呵呵,所以就不会忽略了。再次感谢~有机会一起探讨~,主要是向你学习,我是初学者~
c u~~~~`

TOP

呵,eol的用法是忽略其后定义的字符打头的行,用 eol; 不就忽略了这些query time的行了吗?你试试看!

TOP

发现问题了,呵呵,这样改也行吧
for /f "eol=: tokens=4 delims= " %%k in ('dig @%%j %%i^|find "time"') do (
               set /p=%%k     <nul>>result.txt
缺省是忽略以;开始的字符。

TOP

呵,是;; Query time: 50 msec中开头的';;'在作怪,你这样改:
for /f "tokens=3* delims=; " %%k in ('dig @%%j %%i^|findstr "time"') do (
               set /p=%%k %%l     <nul>>result.txt
)
或者
for /f "tokens=2* delims=; " %%k in ('dig @%%j %%i^|findstr "time"') do (
      set /p=%%l     <nul>>result.txt
)

[ 本帖最后由 lhjoanna 于 2008-12-28 22:57 编辑 ]

TOP

我把findstr /n .*给去掉后测试发现就没有结果了,不知道为什么
我运行批处理的时候还经常有报错出现,是不是这原因导致我有些数据丢失了呢?
正在执行第 50 次
\cvs\9_3_x\lib\isc\mem.c:877: INSIST(ctx->stats.gets == 0U) failed.
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

TOP

^是对特殊符号<,>,&等的前导字符,在命令中他将以上几个个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如
  1. echo test ^>1.txt
复制代码
显示结果则是:test > 1.txt
而不是把test追加到1.txt中。
在for /f %%i in ('.......') do (......)中,in后面的括号,若要用到这些字符,就要用^来转义下。^还有一个功能就是续行,比如
  1. @echo off
  2.    echo  我^
  3.   是^
  4.   中^
  5.   国^
  6.   人
  7. pause>nul
复制代码
我这样理解的,你可以到论坛里的教程看下比较详细的解释。

[ 本帖最后由 lhjoanna 于 2008-12-28 22:41 编辑 ]

TOP

返回列表