知道美河 | 上传资料 | VIP申请 | 精品课程 | 资料搜索 | 问题反馈 | 会员手册 | 积分消费 | 积分充值 | 帐号保护
美河学习学习在线赞助VIP

美河学习在线(主站) eimhe.com

 找回密码
 建立账号
查看: 15362|回复: 1

[原创] DOS下批处理的应用一(快速大量的PING导入到文件)

[复制链接]
发表于 2008-11-28 12:13:17 | 显示全部楼层 |阅读模式
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决' X" J' E* k; `: R
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.: o* B' O; X. e, s  G
DOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:9 L) F% u! `1 ?1 c
for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
7 k& u: ~' }$ T) x: `5 C这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.. w! o" E- d" Y4 Q7 ~" P4 U

7 |4 Y* H+ w1 Z9 g
: G. S5 X; d- G; d
/ h  G+ J6 b; ^& U( f- Y9 R. n# a

4 P2 g( t3 R$ e
1 P- p: j; e1 O( y" w* U3 f% b5 u, e# W7 _! w: c# f) B
对一组文件中的每一个文件执行某个特定命令。" D# m: d! \# R0 L/ a# N1 F

' P, u5 O! @# T& Q% u9 ~FOR %variable IN (set) DO command [command-parameters]0 O* U8 {& I/ N' z: N3 ^! M. p9 h
' u: c* z& [8 ~# x( ^) X% H
  %variable  指定一个单一字母可替换的参数。' p7 j( \/ C3 B. q5 G& {+ v
  (set)      指定一个或一组文件。可以使用通配符。, d; ~$ B' i8 Q$ b; H, k
  command    指定对每个文件执行的命令。
; g% t& |4 e3 g7 D  R  command-parameters- M- J$ Z: \7 |
             为特定命令指定参数或命令行开关。5 ^) ?$ p' x3 T5 [& k5 g

: d* Y6 n! ]6 [0 R在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
/ B% q" G5 w3 _; L1 w1 H. M3 q而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
! a0 ~/ D  J5 s6 n0 p. r
& Z: q- o1 |& Q( d8 E& t如果命令扩展名被启用,下列额外的 FOR 命令格式会受到' V, x/ w8 o0 v$ R
支持:% C2 f  Y; {2 m; _5 z& A/ p, B. d

/ S' b3 C! p- p* O, j% B. p$ a5 OFOR /D %variable IN (set) DO command [command-parameters]; Z! Y9 Z+ a( g% X' d1 b" J

1 k) g# |" T, l    如果集中包含通配符,则指定与目录名匹配,而不与文件
! k, P. G0 @* l1 L    名匹配。
( l) f& B* z6 F/ e0 H0 u" Z9 K% Z: |$ O
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
+ q4 k2 ~$ y6 ]" D$ o8 [, t5 P% T& ?# A9 O# Q+ s
    检查以 [drive:]path 为根的目录树,指向每个目录中的
; A/ }9 s) J; d' E1 ?    FOR 语句。如果在 /R 后没有指定目录,则使用当前
! H  A0 r4 F7 y; d) j    目录。如果集仅为一个单点(.)字符,则枚举该目录树。
- H4 x7 v2 R/ n1 R- G2 T' n
, T5 ^! h$ x7 D2 EFOR /L %variable IN (start,step,end) DO command [command-parameters]
. i0 H( m0 R& C: y; F
, q$ X$ _1 W* T, z# z, T; N4 [8 [    该集表示以增量形式从开始到结束的一个数字序列。% D7 Q/ r7 n/ K2 D' m9 Z+ R
    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
* f& }' i, l8 K7 Y; s5 }    序列 (5 4 3 2 1)。5 M  p/ ^7 T) p4 `) {' w' `

( u. ~' U0 I# x, `% N5 BFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]- [4 j3 x6 Y3 R* b. w
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]* V; E1 e% D- `
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
7 o9 i# Z; y; o: L  G! ?0 i; @3 Y& y+ P
    或者,如果有 usebackq 选项:
' y- l* [: m( Y: {
6 s8 B. b) W+ _2 c6 gFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
" W" ^# p" F8 B8 QFOR /F ["options"] %variable IN ("string") DO command [command-parameters], m' b; K! z5 B% }
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
/ i, ^; F. X* k" s4 @( t& O8 O4 s5 m9 z# d; R) M
    filenameset 为一个或多个文件名。继续到 filenameset 中的
( G' T( `2 i, i: S* n1 ^  K   下一个文件之前,每份文件都已被打开、读取并经过处理。
; J1 q  I' c$ {1 X4 h( g5 W8 T7 V# C    处理包括读取文件,将其分成一行行的文字,然后将每行
7 o. O, P- d  ]0 F' E1 d    解析成零或更多的符号。然后用已找到的符号字符串变量值  ~& K% E' T5 ]! K* g7 [$ ?
    调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
: R& W3 T' h. E    的第一个空白符号。跳过空白行。您可通过指定可选 "options" - o( o8 e0 q( j
    参数替代默认解析操作。这个带引号的字符串包括一个或多个& g) y* ]) w, l4 j
    指定不同解析选项的关键字。这些关键字为:
& `( N8 r  m5 R4 _3 q- a; `
, h2 x  L" o5 S: @5 }        eol=c           - 指一个行注释字符的结尾(就一个)
4 e1 }% ?* @) h3 J0 c        skip=n          - 指在文件开始时忽略的行数。
  F+ P  b4 \$ X8 o        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
4 g$ V0 K6 A" U7 u9 i                          默认分隔符集。
& @! B4 @" c8 s; U( B        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代% F- T* ?" X0 Z$ {9 C1 f+ Z; u/ e
                          的 for 本身。这会导致额外变量名称的分配。m-n
: X5 q/ `" H% }# l: w" J! O                          格式为一个范围。通过 nth 符号指定 mth。如果
# \% C' _7 z' E                          符号字符串中的最后一个字符星号,- u" _, W! Z" T
                          那么额外的变量将在最后一个符号解析之后
; X2 n1 i( {" T8 n2 \! E                          分配并接受行的保留文本。3 E; e$ p2 R# v1 U3 L& h5 y
        usebackq        - 指定新语法已在下类情况中使用:                    
) \) [# o2 v3 A% t                          在作为命令执行一个后引号的字符串并且一个单
& L8 H2 s1 Y# h4 S                          引号字符为文字字符串命令并允许在 filenameset
: a, ~  m  o% `6 b- a: H; W: m$ O                          中使用双引号扩起文件名称。
, I3 X! ?7 c' C- m$ P& K0 N% \
5 }+ k* |8 k5 ]" [    某些范例可能有助:9 |0 c) G/ F/ C7 v
' T+ u' G9 X  l; E8 B; L6 ?' `( b3 J
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k! p% X6 ~: ^! `3 L9 V  j7 i% M* r

, J" L& R2 D3 l) g2 ^$ J    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将& Q9 A* h7 D* }! C  A/ F
    每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
3 h  ]- C3 b! K' h3 q/ c- D' ~" A    空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
9 J$ g3 r# `) q0 p- [5 a9 T/ G    取得第二个符号,引用 %j 来取得第三个符号,引用 %k
7 g: d# B3 R3 S$ \    来取得第三个符号后的所有剩余符号。对于带有空格的文件
1 @/ b3 ?' K- Y, S% E( h7 B  R    名,您需要用双引号将文件名括起来。为了用这种方式来使- w7 p7 F$ m/ J1 Z6 ]) _8 G4 f  b
    用双引号,您还需要使用 usebackq 选项,否则,双引号会/ B+ t! M& t; {7 ?0 B* w  Y- i
    被理解成是用作定义某个要分析的字符串的。
* l8 W7 A* e2 n' h. i" h
* \6 W) j# u1 w" H5 d. T# \, ^    %i 专门在 for 语句中得到说明,%j 和 %k 是通过
$ S" s. |, n8 X# y3 X+ U    tokens= 选项专门得到说明的。您可以通过 tokens= 一行& `4 c( k5 ^! T4 m+ S: `4 Q. t
    指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
+ t  T: F1 v- \    'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,$ H0 \0 X# r% d6 s1 H
    同时不能有 52 个以上都在使用中。
2 L) h. r& {% z' {, i- B9 d6 {% v7 M, z
    您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
! N  F; |4 D9 u) }    用单引号将括号之间的 filenameset 括起来。这样,该字符
8 L( Q; }) p- f3 W: s    串会被当作一个文件中的一个单一输入行。
; z/ N; }4 R. `- d4 {  N. [% [+ a$ U. [
    最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将/ h$ [4 s, N1 S4 h: E. {$ j* J
    括号之间的 filenameset 变成一个反括字符串。该字符串会0 ~: E1 b, u3 ?  P* p
    被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
: b/ z" j- P3 c0 m. h% F3 @% N    内存,并被当作文件分析。因此,以下例子:
: o  h) d5 Y4 ], W7 |/ L. G4 ?: W( g1 m' Z% R  I. B
      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
+ o: R& g5 H0 |* Y& G* A, l6 y0 ^1 O5 U# ?) G
    会枚举当前环境中的环境变量名称。
0 ^- N4 Z: m$ L8 `2 i! {- W
0 O- X- p8 K- E% r7 Q. }' `另外,FOR 变量参照的替换已被增强。您现在可以使用下列: Y. X5 v. B3 I. g' |( H8 Z
选项语法:
: e5 |7 l8 w# n  ]8 E1 s, j; l, ?7 N/ C& h: T, T# L! m, z
     ~I         - 删除任何引号("),扩充 %I
: ]( [: l5 u) N$ w1 N' _     %~fI        - 将 %I 扩充到一个完全合格的路径名
; D8 P9 V, g$ u3 o7 N5 X3 g& J, x     %~dI        - 仅将 %I 扩充到一个驱动器号
: J$ O8 \  u2 x6 J, Y* n+ D     %~pI        - 仅将 %I 扩充到一个路径& F: r  Y, y3 _1 n; I% [; z* @
     %~nI        - 仅将 %I 扩充到一个文件名
/ m5 S$ Q8 ?2 l) q0 J$ _& ]2 x6 ^- \     %~xI        - 仅将 %I 扩充到一个文件扩展名9 u3 r- L* I6 {- B
     %~sI        - 扩充的路径只含有短名
- N6 y) I6 `. G% P; y     %~aI        - 将 %I 扩充到文件的文件属性
  z$ F/ S; P2 y! d: s6 {* f     %~tI        - 将 %I 扩充到文件的日期/时间
) F9 t. N6 W! U4 }$ S# @+ N' F  O0 A% g     %~zI        - 将 %I 扩充到文件的大小
. ?, k9 K9 @" I6 H: ?5 r3 g     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充  H% I2 w1 k9 J5 x
                   到找到的第一个完全合格的名称。如果环境变量名, r- B! t& p' G: A- I
                   未被定义,或者没有找到文件,此组合键会扩充到; j- i& ^( }: s" i
                   空字符串- v  U5 ]% @  u# \& i/ ?
, R; ]' i2 s; `& J6 g: r
可以组合修饰符来得到多重结果:) O8 U# T7 I+ Q* e1 {2 E, m

7 R! N, v2 ^( {( G. l     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
; f/ N1 X1 Y: p1 k1 c     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
# d9 c% Y# w$ |$ \, ?5 ^' t     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名1 V/ E8 D: ]: G. K- _
     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
( a0 ]) ^/ u4 |                   到找到的第一个驱动器号和路径。
5 ~. A4 K! W9 Q( M0 r( O. z     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR, s2 A! ]8 u) H, m5 p  P  n* b

  _+ t! v* Y, J7 N; w* E在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
! o0 D- x% l' }% {6 a1 H" i7 i, b用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名6 i/ X- N7 a$ w! j
比较易读,而且避免与不分大小写的组合键混淆。
; I0 R4 j( g3 e7 M$ C0 z! \; }' N4 ?# g: c1 @" G0 _3 |

8 U; J/ p  s3 [( h8 u) F" T---------------------------------------& }8 `( p( ?8 ?! P6 b1 |4 Z. S
转自 http://www.cnblogs.com/tanzhiwei/& P, ?- D. `+ ]2 z) y) H
7 F1 g3 N6 x( E0 `$ Z7 i( Q
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ]

评分

1

查看全部评分

发表于 2008-11-28 13:02:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 建立账号

本版积分规则

 
QQ在线咨询

QQ|小黑屋|手机版|Archiver|美河学习在线 ( 浙网备33020302000026号 )

GMT+8, 2026-9-25 01:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表