[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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 高手 指教

没人支持啊~自己顶一下~

TOP

dig是干啥用的啊?最好传上来。不方便的话把dig后的结果传上来也行。

TOP

dig结果如下:
;; Query time: 390 msec
;; Query time: 406 msec
;; Query time: 343 msec
;; Query time: 343 msec

TOP

我在网上找了个答案,我做了一些改进,目前可以实现我的要求了,不妨一起探讨一下。
@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

TOP

感觉这里的高手响应的不是很及时啊,呵呵

TOP

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

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

TOP

看了楼主在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
复制代码

TOP

楼上的兄台,我用你的批处理执行结果如下:
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
最后还要做查询-替换处理~

TOP

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

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

TOP

我看了执行效果,我在帖子里回复了,返回的值是唯一的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

TOP

TOP

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

TOP

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>

TOP

我想要的是:30:;; Query time: 375 msec,而这个对不同的网站,行号是不同的。

TOP

返回列表