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

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

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

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

[复制链接]
发表于 2008-11-28 12:13:17 | 显示全部楼层 |阅读模式
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决2 \+ [% G1 ]2 k* b, a: b
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.- ?2 j5 Z9 |& t* p" {0 s) p
DOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:
' [3 {3 U" a3 K& `  Q/ i, e/ Dfor /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
# j+ D4 {7 U$ g' X这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.
! o  f1 L1 N. ?! ]) a" Q5 x
2 }6 F  X+ Y  Y4 A7 J1 C& B- f$ b5 n! k
- o$ z* Q& |" |- k4 g3 I

+ _: `" a) u# z9 X1 ~& r- C8 @/ a' A

, n, E) O" v8 Y
! w* \# L" E8 `7 r& k对一组文件中的每一个文件执行某个特定命令。  I3 @) H" B/ }: X

% N' Z$ l  g( {0 Y! KFOR %variable IN (set) DO command [command-parameters]5 `" S9 p2 G; S) f
1 n) h: R% R  ]4 h0 C
  %variable  指定一个单一字母可替换的参数。
% \7 N$ L! X  ?  (set)      指定一个或一组文件。可以使用通配符。9 V9 q+ b4 `3 K6 x
  command    指定对每个文件执行的命令。
3 T* B: O8 P. B* d7 U" S  command-parameters) M) a$ R" v2 M, q7 L% W4 N
             为特定命令指定参数或命令行开关。
& P' W  M& L8 n9 e' @& [8 x9 f7 }! B0 q1 J7 R3 b
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
/ P4 \& Z. E. v8 z' d而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
; N4 y( E0 Z9 n  N# p2 H7 h, ^* O6 ]- P/ B+ A3 T
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
4 Y3 z4 ?1 h3 C( @7 e& p支持:5 r# n# O! k1 p, q1 z# G
( E  \* a& Y" X" U
FOR /D %variable IN (set) DO command [command-parameters]
$ v# L7 j- B5 K2 Y, Z. f  N( y2 z$ l1 v( |9 h% g! A3 \  \; \
    如果集中包含通配符,则指定与目录名匹配,而不与文件
, `; Z! y$ x# B5 \/ \* A    名匹配。
; v7 {# a$ e* l. w1 V7 ?3 _  L  m7 y+ J8 J+ P) l$ s
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
! S+ j% y! m0 D3 G- C7 b1 p8 @: }& ?* x" u1 W$ d: P
    检查以 [drive:]path 为根的目录树,指向每个目录中的: u* J: o# V% M, e
    FOR 语句。如果在 /R 后没有指定目录,则使用当前
; d: y8 N8 Y# i  \8 B9 d0 D    目录。如果集仅为一个单点(.)字符,则枚举该目录树。! b, c* E- L1 Z% x
; f2 q5 x% g% a4 \/ b0 Q, O
FOR /L %variable IN (start,step,end) DO command [command-parameters]+ b& v& A8 a1 X" E7 t& S# ~
- l, T0 H: A6 r; Y* O% Y) f
    该集表示以增量形式从开始到结束的一个数字序列。6 |! F+ X7 `) N2 K% ^4 i9 n4 i
    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
! y8 x% R% ?2 P$ K4 B  U- g4 a    序列 (5 4 3 2 1)。2 T! x6 j' b. T* b

% P* M& U- r/ |) u8 K+ w/ T  NFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]- ?- @# p1 }( P( w% S; H9 K
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
  q5 N/ n, z5 o4 u) V2 ^& X- h' sFOR /F ["options"] %variable IN ('command') DO command [command-parameters]3 Q. W! t4 V, _+ G

' H6 k8 X2 \+ x1 k    或者,如果有 usebackq 选项:
" o* m% r: @+ ~8 S4 K' S  B% S1 X; [# F4 O) ~
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
! o# i6 ?0 S3 W3 e+ R: pFOR /F ["options"] %variable IN ("string") DO command [command-parameters]
- L  f0 X! {) ^4 JFOR /F ["options"] %variable IN ('command') DO command [command-parameters]' O; h/ Y1 F2 y8 O5 N9 H
# G9 c8 z5 z- u5 K4 v
    filenameset 为一个或多个文件名。继续到 filenameset 中的, ^' b6 }( k, c* g) {! k& c) B) }1 Z
   下一个文件之前,每份文件都已被打开、读取并经过处理。9 l( d0 j3 K6 v3 B& @% L4 F
    处理包括读取文件,将其分成一行行的文字,然后将每行$ }7 y  n! Y1 P3 v% g4 b
    解析成零或更多的符号。然后用已找到的符号字符串变量值
3 {! p" X  I" T* `, u( V- R8 {    调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
1 w2 r) K; O* [* i2 J; M    的第一个空白符号。跳过空白行。您可通过指定可选 "options"
4 {9 Q3 v( z# e, s+ j8 g    参数替代默认解析操作。这个带引号的字符串包括一个或多个
( H8 s6 f3 u" E3 b# ?. D" F; T    指定不同解析选项的关键字。这些关键字为:
$ h! @: h* p! y; s& c2 H' M; i( |9 o( ?. L: |+ w) ^. {
        eol=c           - 指一个行注释字符的结尾(就一个)
/ P5 M  y& E1 m        skip=n          - 指在文件开始时忽略的行数。
  E2 q/ q9 E" Q3 v        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的: n8 v+ a7 c& z$ A
                          默认分隔符集。
! D6 X3 ^' M. n4 S: }        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
7 U9 w5 q. k# O" D) p8 Z! h                          的 for 本身。这会导致额外变量名称的分配。m-n
. e3 O+ [) p! n; e0 v. A' q" x                          格式为一个范围。通过 nth 符号指定 mth。如果
8 V% Y4 W& J4 O+ ?: G                          符号字符串中的最后一个字符星号,! L! a& r) [' K* z! N( h
                          那么额外的变量将在最后一个符号解析之后6 y6 m) B3 U0 Z; n% J* e6 U
                          分配并接受行的保留文本。. k2 o# S: |$ f$ z
        usebackq        - 指定新语法已在下类情况中使用:                    
/ ^+ v3 B4 t7 u. S6 q" ^" f                          在作为命令执行一个后引号的字符串并且一个单
. a* b+ g2 I  S) ~) F7 m                          引号字符为文字字符串命令并允许在 filenameset: z6 y1 \/ h# L! k) m9 k7 ]
                          中使用双引号扩起文件名称。% }( e  }' c" b. A7 n
6 G: t3 P. U$ `7 H
    某些范例可能有助:/ d  |0 E( s: r0 H1 }/ t
; q7 }* p: Q" f* S
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k! [7 s) X9 v" f" m2 }: E# s; e

& [& C7 c2 P  E. R6 m1 v( o+ H    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将! A& r) \9 s# H  h4 d- ]2 F8 R
    每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
, u/ W5 W5 Y3 Y7 z- j" I    空格定界符号。请注意,这个 for 程序体的语句引用 %i 来  Q* H- j8 H0 Q  L& o/ U
    取得第二个符号,引用 %j 来取得第三个符号,引用 %k, C5 [0 g; w, i% I) D3 ~  i. ?$ p
    来取得第三个符号后的所有剩余符号。对于带有空格的文件( l/ ]$ [1 h# [3 S
    名,您需要用双引号将文件名括起来。为了用这种方式来使
. v! U/ u1 @0 k( R    用双引号,您还需要使用 usebackq 选项,否则,双引号会
. @6 C5 \; Z& W    被理解成是用作定义某个要分析的字符串的。3 `0 x% n5 {! y1 r: Z

% l4 x9 ?. C# H$ J) r# @! k: y# e    %i 专门在 for 语句中得到说明,%j 和 %k 是通过  a5 D3 k# Q8 z
    tokens= 选项专门得到说明的。您可以通过 tokens= 一行
+ R4 ~; w* {' \1 B! w" b    指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或7 [* v3 u; F# A* X
    'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
9 q& {9 q* z9 v# h# n+ }    同时不能有 52 个以上都在使用中。
  L6 X3 U) D- N- f% |4 z8 C6 y$ p8 j. N; l8 N
    您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
% S, s2 q. Y% S% J    用单引号将括号之间的 filenameset 括起来。这样,该字符- a# }, ]0 @- A6 V3 q2 H  H9 i
    串会被当作一个文件中的一个单一输入行。
  L' A: {5 E6 @5 |* N; F/ s0 i  A9 Q9 u4 L9 {0 L
    最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
$ J  u. k5 ~% t    括号之间的 filenameset 变成一个反括字符串。该字符串会) g; Z) k' @8 d& P
    被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
# l! [4 D- _( O. E: S! Z    内存,并被当作文件分析。因此,以下例子:8 {- \. ], d% g* c' C. f7 c

0 h1 m4 D# l6 B. _9 p* n6 Y) y% ]      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
+ e: l0 e0 X) v5 b" b- U! h8 S' v* A# G* z8 o: P, p
    会枚举当前环境中的环境变量名称。
) @( W6 {5 L6 s2 t# x
+ e; v3 t- p4 C3 C/ |另外,FOR 变量参照的替换已被增强。您现在可以使用下列" w6 i8 x- A3 t( U0 [
选项语法:9 k4 c1 r) l" J; q: o' `

+ F" o% G3 L/ e/ k2 @' S8 R     ~I         - 删除任何引号("),扩充 %I1 A1 a# p) z7 \. q% g
     %~fI        - 将 %I 扩充到一个完全合格的路径名
/ m. E: R! Q: W/ q8 ~" E! K3 t     %~dI        - 仅将 %I 扩充到一个驱动器号  n$ [) C/ @8 k
     %~pI        - 仅将 %I 扩充到一个路径  \  x9 ?4 l5 U; P, v
     %~nI        - 仅将 %I 扩充到一个文件名
8 ?/ X6 |) i: P     %~xI        - 仅将 %I 扩充到一个文件扩展名
! [1 P2 g7 j5 y     %~sI        - 扩充的路径只含有短名2 T6 ^  F" X) w, w9 l. p/ J
     %~aI        - 将 %I 扩充到文件的文件属性0 m; D4 N1 W# C
     %~tI        - 将 %I 扩充到文件的日期/时间( I$ o* `& g: D; z' \
     %~zI        - 将 %I 扩充到文件的大小
2 q1 x  ?. e, D6 }+ k     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充9 f: f- y0 P- s. p9 c) ~/ P0 n9 z
                   到找到的第一个完全合格的名称。如果环境变量名
3 I7 U2 x- ]) a$ p1 f                   未被定义,或者没有找到文件,此组合键会扩充到
3 O6 d4 M* K3 \( B+ Q                   空字符串
! W2 F' a. q, ]3 Q2 H- m4 R0 j2 t* |8 k: {; @+ A- P+ w
可以组合修饰符来得到多重结果:
! p' D8 g" w& T) h) p' o
6 b  `# {3 \8 m) S1 ]8 L3 l* Q8 j     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径( h3 K, x/ Y8 e- f- t
     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名" D, y/ I' f, f6 ]3 J4 E- Q
     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名0 m3 n) m2 Y7 n6 J; z7 b, f# I
     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充; q& i$ R; n$ l& G7 T
                   到找到的第一个驱动器号和路径。 : l: [9 V7 \$ H3 D" ^2 Y% o
     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR3 J& x' u' B1 h3 b
+ ~- _: z, m/ o6 [5 z) B9 h
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法  q. s" V* o! `0 @; `
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
2 m( \2 C% q0 P+ M比较易读,而且避免与不分大小写的组合键混淆。
8 P4 P  C/ f% C$ V/ ^5 p1 H2 o6 h
5 x- N, [$ k4 Q& E: ]8 V
" u- d% F, N1 S3 q/ R! t% y---------------------------------------
& ?+ _* b9 K+ l- X6 G转自 http://www.cnblogs.com/tanzhiwei/, P/ v! I1 W3 z# s2 r
6 a2 o) Y: a, z
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ]

评分

1

查看全部评分

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

本版积分规则

 
QQ在线咨询

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

GMT+8, 2026-6-17 18:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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