Board logo

标题: 【已结】批处理如何生成多行多列文件 [打印本页]

作者: in2bat    时间: 2008-12-26 14:10     标题: 【已结】批处理如何生成多行多列文件

请教一个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 高手 指教
作者: in2bat    时间: 2008-12-26 21:36

没人支持啊~自己顶一下~
作者: lhjoanna    时间: 2008-12-27 10:15

dig是干啥用的啊?最好传上来。不方便的话把dig后的结果传上来也行。
作者: in2bat    时间: 2008-12-28 08:57

dig结果如下:
;; Query time: 390 msec
;; Query time: 406 msec
;; Query time: 343 msec
;; Query time: 343 msec
作者: in2bat    时间: 2008-12-28 08:58

我在网上找了个答案,我做了一些改进,目前可以实现我的要求了,不妨一起探讨一下。
@echo off
cd.>>com.csv
set h=0
:h
if %h% GEQ 1 set "fc=skip=%h%"
set end=1
for /f %%i in ('dir /b *com*') do (
if not %%~nxi==com.csv set fi=%%~nxi&call:p
)
if %end%==0 echo.>>com.csv&set/a h+=1&goto h
pause
:p
for /f "eol=: %fc% delims=xxx" %%j in ('type %fi%') do (
set /p=%%j <nul>>com.csv
set end=0
set tab=0
echo %fi% %h% %tab%
goto :eof
)
if "%tab%"=="1" set /p= <nul>>com.csv
set tab=1
作者: in2bat    时间: 2008-12-28 08:59

感觉这里的高手响应的不是很及时啊,呵呵
作者: lhjoanna    时间: 2008-12-28 14:31

呵,我想不是大家不及时响应,而是楼主的帖子内容缺少些东西吧。我想楼主还是把dig发上来,4楼的结果太模糊了。是dig谁的结果,是dig一次还是几次的结果,是结果的全部还是结果的部分?题目并不难,但缺少这些东西却不好调试。还有楼主是想要把1楼的表格作为结果输出到一个文件中吧。5楼的例子中好像没有用到dig啊??

[ 本帖最后由 lhjoanna 于 2008-12-28 14:32 编辑 ]
作者: lhjoanna    时间: 2008-12-28 16:01

看了楼主在cndos也发了个帖子,也大概了解了一些。但还有一个问题不理解,就是每次dig后会产生几个query time,楼主需要的是哪个。按照楼主的意思,dig一次结果是没有意义的,所以需要dig多次,我写了一个代码,只取每次dig后的第一个query time,可以dig多次,次数自己设定,默认10次。
  1. @echo off&setlocal enabledelayedexpansion
  2. cd.>result.txt
  3. for /f "tokens=2 delims=." %%i in (www.txt) do (
  4.     for /f "delims=" %%j in (dnsip.txt) do (
  5.         set /p=    %%j(%%i^) <nul>>result.txt
  6.     )
  7. )
  8. echo.>>result.txt
  9. for /l %%a in (1 1 10) do (
  10.     cls
  11.     echo 正在执行第 %%a 次
  12.     set /p=%%a    <nul>>result.txt
  13.     for /f %%i in (www.txt) do (
  14.        for /f %%j in (dnsip.txt) do (
  15.            for /f "tokens=3 delims=:" %%k in ('dig %%j %%i^|findstr /n ".*"^|findstr "14:"') do (
  16.                set /p=%%k           <nul>>result.txt
  17.            )
  18.        )
  19.     )
  20.     echo.>>result.txt
  21. )
  22. echo.&echo 执行完毕!
  23. pause>nul
复制代码

作者: in2bat    时间: 2008-12-28 21:10

楼上的兄台,我用你的批处理执行结果如下:
219.148.198.130(yahoo)     219.148.198.131(yahoo)     219.148.198.136(yahoo)     219.148.198.130(chinatelecom)     219.148.198.131(chinatelecom)     219.148.198.136(chinatelecom)     219.148.198.130(163)     219.148.198.131(163)     219.148.198.136(163)     219.148.198.130(taobao)     219.148.198.131(taobao)     219.148.198.136(taobao)     219.148.198.130(baidu)     219.148.198.131(baidu)     219.148.198.136(baidu)     219.148.198.130(17173)     219.148.198.131(17173)     219.148.198.136(17173)     219.148.198.130(sohu)     219.148.198.131(sohu)     219.148.198.136(sohu)     219.148.198.130(xinhuanet)     219.148.198.131(xinhuanet)     219.148.198.136(xinhuanet)     219.148.198.130(qq)     219.148.198.131(qq)     219.148.198.136(qq)     219.148.198.130(sina)     219.148.198.131(sina)     219.148.198.136(sina)     219.148.198.130(tom)     219.148.198.131(tom)     219.148.198.136(tom)
1     108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108           
2     108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108            108           
为什么会全是108啊?是不是脚本里的'dig %%j %%i^|findstr /n ".*"^|findstr "14:"'有问题啊,感觉脚本执行速度特别慢,有时间的话,继续探讨啊,我要dig 50次或100次,我最后用我自己的程序得到的结果如下:
130--163.com   130--17173.com   130--baidu.com.cn   130--chinatelecom.cn
;; Query time: 0 msec  ;; Query time: 93 msec  ;; Query time: 31 msec
;; Query time: 0 msec  ;; Query time: 0 msec  ;; Query time: 0 msec  
;; Query time: 0 msec  ;; Query time: 0 msec  ;; Query time: 0 msec  
;; Query time: 0 msec  ;; Query time: 0 msec  ;; Query time: 0 msec  
;; Query time: 0 msec  ;; Query time: 0 msec  ;; Query time: 0 msec  
;; Query time: 0 msec  ;; Query time: 15 msec  ;; Query time: 0 msec
最后还要做查询-替换处理~
作者: lhjoanna    时间: 2008-12-28 21:19

打开文本文件后取消自动换行,第一行为dig的对象,所以少的时候清晰些。14是指dig后的结果的第14行,也就是第一个query time所在的行。至于108我也不清楚,楼主把你测试的www.txt和dnsip.txt的内容发来还有result.txt传上来,我调试下。

[ 本帖最后由 lhjoanna 于 2008-12-28 21:22 编辑 ]
作者: in2bat    时间: 2008-12-28 21:21

我看了执行效果,我在帖子里回复了,返回的值是唯一的msec,感觉是不是dig有问题 了?我用我的程序的执行结果也给你写在帖子上了,其实我的程序是两个批处理,首先dig出来很多txt文件,每个txt文件,对应一个网址和ip,然后再把这些txt文件合并到一起。
但我发现我弄的合并批处理有丢失数据的问题。我把我的批处理给你弄上来:
dig.bat文件如下:
@echo off
setlocal enabledelayedexpansion
del d:\dns-result\*.txt
FOR /F %%i IN (D:\www.txt) DO (FOR /F %%j IN (D:\dnsip.txt) DO (
set viname=%%i
set vjname=%%j
echo !vjname:~-3!--!viname:~4! >d:\dns-result\!vjname:~-3!--!viname:~4!.txt
FOR /L %%a IN (1,1,50) DO (dig @%%j %%i | find  "time" >>d:\dns-result\!vjname:~-3!--!viname:~4!.txt )))
hebin.bat文件如下:
@echo off
cd.>>com.csv
set h=0
:h
if %h% GEQ 1 set "fc=skip=%h%"
set end=1
for /f %%i in ('dir /b *com*') do (
if not %%~nxi==com.csv set fi=%%~nxi&call:p
)
if %end%==0 echo.>>com.csv&set /a h+=1&goto h
pause
:p
for /f "eol=: %fc% delims=@" %%j in ('type %fi%') do (
set /p=%%j <nul>>com.csv
set end=0
set tab=0
echo %fi% %h% %tab%
echo %fi% %h% %tab% >>hebin.log
goto :eof
)
if "%tab%"=="1" set /p= <nul>>com.csv
set tab=1
作者: in2bat    时间: 2008-12-28 21:23

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内容如下:
219.148.198.130
219.148.198.131
219.148.198.136
作者: lhjoanna    时间: 2008-12-28 21:30

在我这里测试正常啊,没有出现108的情况。我明白原因了,大概是咱们的dig版本不一样,你运行下dig 219.148.198.130  www.yahoo.com.cn |findstr /n .* 然后把结果发来。
作者: in2bat    时间: 2008-12-28 21:35

C:\Documents and Settings\Administrator>dig 219.148.198.130  www.yahoo.com.cn |
indstr /n .*
1:;; Got answer:
2:;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 1094
3:;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
4:
5:;; QUESTION SECTION:
6:;219.148.198.130.             IN      A
7:
8:;; AUTHORITY SECTION:
9:.                     8103    IN      SOA     A.ROOT-SERVERS.NET. NSTLD.VERIS
GN-GRS.COM. 2008122800 1800 900 604800 86400
10:
11:;; Query time: 281 msec
12:;; SERVER: 219.148.198.130#53(219.148.198.130)
13:;; WHEN: Sun Dec 28 21:34:39 2008
14:;; MSG SIZE  rcvd: 108
15:
16:
17:; <<>> DiG 9.3.2 <<>> 219.148.198.130 www.yahoo.com.cn
18:;; global options:  printcmd
19:;; Got answer:
20:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1102
21:;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
22:
23:;; QUESTION SECTION:
24:;www.yahoo.com.cn.           IN      A
25:
26:;; ANSWER SECTION:
27:www.yahoo.com.cn.    40477   IN      CNAME   homepage.vip.cnb.yahoo.com.
28:homepage.vip.cnb.yahoo.com. 300      IN      A       202.165.102.205
29:
30:;; Query time: 375 msec
31:;; SERVER: 219.148.198.130#53(219.148.198.130)
32:;; WHEN: Sun Dec 28 21:34:39 2008
33:;; MSG SIZE  rcvd: 90
34:
C:\Documents and Settings\Administrator>
作者: in2bat    时间: 2008-12-28 21:36

我想要的是:30:;; Query time: 375 msec,而这个对不同的网站,行号是不同的。
作者: in2bat    时间: 2008-12-28 21:45

改成:'dig %%j %%i^|findstr /n ".*"^|findstr "time"'
测试就正常了,感觉速度很慢啊,呵呵,
结果如下:
    219.148.198.130(yahoo)     219.148.198.131(yahoo)     219.148.198.136(yahoo)     219.148.198.130(chinatelecom)     219.148.198.131(chinatelecom)     219.148.198.136(chinatelecom)     219.148.198.130(163)     219.148.198.131(163)     219.148.198.136(163)     219.148.198.130(taobao)     219.148.198.131(taobao)     219.148.198.136(taobao)     219.148.198.130(baidu)     219.148.198.131(baidu)     219.148.198.136(baidu)     219.148.198.130(17173)     219.148.198.131(17173)     219.148.198.136(17173)     219.148.198.130(sohu)     219.148.198.131(sohu)     219.148.198.136(sohu)     219.148.198.130(xinhuanet)     219.148.198.131(xinhuanet)     219.148.198.136(xinhuanet)     219.148.198.130(qq)     219.148.198.131(qq)     219.148.198.136(qq)     219.148.198.130(sina)     219.148.198.131(sina)     219.148.198.136(sina)     219.148.198.130(tom)     219.148.198.131(tom)     219.148.198.136(tom)
1     250 msec            343 msec            250 msec            250 msec            250 msec            250 msec            265 msec            250 msec            250 msec            250 msec            265 msec            265 msec            250 msec            281 msec            250 msec            250 msec            281 msec            250 msec            265 msec            328 msec            250 msec            265 msec            250 msec            250 msec            265 msec            281 msec            265 msec            265 msec            250 msec            250 msec            250 msec            359 msec            250 msec            250 msec            265 msec            250 msec            250 msec            312 msec            265 msec            250 msec            250 msec            265 msec            265 msec            343 msec            265 msec            265 msec            265 msec            250 msec            250 msec            328 msec            250 msec            250 msec            265 msec            250 msec            265 msec            437 msec            250 msec            250 msec            265 msec            281 msec            250 msec            375 msec            250 msec            265 msec            265 msec            250 msec           
2     250 msec            250 msec            265 msec            265 msec            265 msec            250 msec            265 msec            250 msec            281 msec            265 msec            265 msec            281 msec            281 msec            265 msec            281 msec            265 msec            281 msec            281 msec            281 msec            265 msec            250 msec            328 msec            265 msec            281 msec            281 msec            281 msec            265 msec            265 msec            250 msec            265 msec            265 msec            265 msec            265 msec            265 msec            265 msec            265 msec            250 msec            265 msec            250 msec            250 msec            265 msec            265 msec            296 msec            265 msec            265 msec            250 msec            265 msec            265 msec            250 msec            250 msec            343 msec            250 msec            265 msec            250 msec            250 msec            250 msec            265 msec            265 msec            250 msec            250 msec            265 msec            265 msec            265 msec            281 msec            265 msec            265 msec           
3     265 msec            250 msec            265 msec            265 msec            281 msec            250 msec            250 msec            265 msec            281 msec            281 msec            265 msec            281 msec            281 msec            265 msec            281 msec            265 msec            265 msec            265 msec            359 msec            343 msec            296 msec            250 msec            250 msec            281 msec            250 msec            250 msec            265 msec            265 msec            265 msec            281 msec            296 msec            265 msec            281 msec            265 msec            265 msec            250 msec            265 msec            265 msec            265 msec            250 msec            250 msec            250 msec            265 msec            250 msec            250 msec            250 msec            250 msec            265 msec            250 msec            265 msec            265 msec            250 msec            250 msec            265 msec            250 msec            421 msec            265 msec            265 msec            265 msec   

只能再做一次查询替换了,再问一下如何直接生成*.csv格式的,每个区域占一个单元格。
作者: lhjoanna    时间: 2008-12-28 21:47

恩,咱们的dig版本不一样。不过如果每次的行数不一样,那就不能用行数来提取时间了,楼主关于query time的提取有什么规律吗?比如find "time'后会出现好几个query time,楼主想要的是第几个?

[ 本帖最后由 lhjoanna 于 2008-12-28 21:52 编辑 ]
作者: in2bat    时间: 2008-12-28 21:56

我dig的结果只有一个query time,所以我就取了time关键字,但是我用你的程序输出之后转换成.csv,再数据分列之后发现结果也比较怪异,正常是每个列标题下对应时间,但我分列结果还有很多时间上面没有列标题:
219.148.198.131(tom)219.148.198.136(tom)
359250250265250250312
265265265265265250265
265281265265250265265
265250250250234265250
265265250265250265250

我把我的结果给你看看,你可以转换成.xls分列看看效果。
作者: lhjoanna    时间: 2008-12-28 22:08

我看到你的结果了,网址有11个,ip地址有三个,组合起来每循环一次应该执行33次,即每一行应该有33个 XXmsec可是你的结果中每次循环后怎么不止33个,原因应该是这个吧?

[ 本帖最后由 lhjoanna 于 2008-12-28 22:10 编辑 ]
作者: in2bat    时间: 2008-12-28 22:18

是的,我对程序有做了一下修改,修改如下:
1、把for循环的先后顺序颠倒了一下;
2、取列标题ip地址部分改为最后三位了;
3、dig内容改为dig @ip地址 www网址,这样dig出来的结果只有一个time,否则就会出现多个time字段,我测试了tom.com这个网站发现的,这个原因导致了结果会有time数大于列标题数量,不知道我说的是否清晰;
感谢兄台~
目前批处理结果如下:

@echo off&setlocal enabledelayedexpansion
cd.>result.txt
for /f "tokens=4 delims=." %%j in (dnsip.txt) do (
    for /f "tokens=2 delims=." %%i in (www.txt) do (
        set /p=    %%j(%%i^) <nul>>result.txt
    )
)
echo.>>result.txt
for /l %%a in (1 1 5) do (
    cls
    echo 正在执行第 %%a 次
    set /p=%%a    <nul>>result.txt
    for /f %%j in (dnsip.txt) do (
       for /f %%i in (www.txt) do (
           for /f "tokens=3 delims=:" %%k in ('dig @%%j %%i^|findstr /n ".*"^|findstr "time"') do (
               set /p=%%k     <nul>>result.txt
           )
       )
    )
    echo.>>result.txt
)
echo.&echo 执行完毕!
pause>nul
作者: lhjoanna    时间: 2008-12-28 22:20

出现多余的 XXXmsec  的原因是在某次循环的某次dig中出现的query time 不止一个,程序中没有设置写入result.txt的个数的限制,所以每次循环每次dig出现几个query time ,则往文件中写入几个值。你再测试下你的dig.exe看看是不是这种情况。
作者: in2bat    时间: 2008-12-28 22:29

又做了一个改进:
for /f "tokens=4 delims= " %%k in ('dig @%%j %%i^|findstr /n ".*"^|findstr "time"')
可以按空格" "来划分域,选第四个域,就可以直接输出时间。另外想请教一下,你程序里很多地方都带有^符号,不知道是什么含义^|和%%i^有区别么?
还有就是set /p=    %%j(%%i^) <nul>>result.txt
这个语句是什么意思啊?是不是遇到nul就跳出?/p ?

[ 本帖最后由 in2bat 于 2008-12-28 22:30 编辑 ]
作者: lhjoanna    时间: 2008-12-28 22:31

恩,这样修改可以解决你的问题吗?程序没什么问题,就是可以吧findstr /n .*给去掉了,刚才是因为提取行数才用的,现在是查找“time”了,所以不用这个也可以。
作者: lhjoanna    时间: 2008-12-28 22:39

^是对特殊符号<,>,&等的前导字符,在命令中他将以上几个个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如
  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 编辑 ]
作者: in2bat    时间: 2008-12-28 22:51

我把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.
作者: lhjoanna    时间: 2008-12-28 22:55

呵,是;; 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 编辑 ]
作者: in2bat    时间: 2008-12-28 23:02

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

呵,eol的用法是忽略其后定义的字符打头的行,用 eol; 不就忽略了这些query time的行了吗?你试试看!
作者: in2bat    时间: 2008-12-28 23:13

我用的是冒号,缺省是分好,呵呵,所以就不会忽略了。再次感谢~有机会一起探讨~,主要是向你学习,我是初学者~
c u~~~~`
作者: lhjoanna    时间: 2008-12-28 23:30

咦,是啊。奇怪,eol=: 就可以了,我还得好好思考下,不用向我学习啊,我也在不断学习,一起学习吧。
作者: lhjoanna    时间: 2008-12-28 23:49

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

就你们在讨论?
下面这样行不?
  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
复制代码

作者: in2bat    时间: 2008-12-29 09:10

楼上的是dig一次的结果,我想要的是dig 50次或者100次的平均值的结果。
作者: in2bat    时间: 2008-12-29 09:19

我感觉我们研究的方法执行速度很慢,是不是代码不够优化呢?有想法的话,可以一起探讨一下。
作者: terse    时间: 2008-12-29 10:44

原帖由 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
复制代码

作者: lhjoanna    时间: 2008-12-29 15:11

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

感谢各位的热心帮助~从这里面也学到了不少知识,我最终使用批处理如下:
@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




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2