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

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

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

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

[复制链接]
发表于 2008-11-28 12:13:17 | 显示全部楼层 |阅读模式
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决
0 q4 @! i+ w4 p' N/ C1 P不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.
2 `" _+ k  s- d4 D, jDOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:
+ ]) q0 P# ~2 ?for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
. [- }4 v9 \! l$ t5 J这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.2 x- p0 i8 X" k4 W  J
5 {2 A  C8 _. a) Q' c! b3 h& K6 D
& I* O, B/ P& L# x

# b; }: |* h" M  m4 W
  f: g" z* Q% F6 ?( P3 ~3 b( N# H* D" Z! e6 r0 `' E# `
) s$ ~- y4 l. f' @0 }7 h
8 d" J, l1 o! Z9 h$ I
对一组文件中的每一个文件执行某个特定命令。
0 H/ ^4 M" A( `- ^: C/ f- X" ~6 N
FOR %variable IN (set) DO command [command-parameters]
( l9 m+ R+ c. o0 u7 g+ W& Z! z6 a0 a9 t  T: F, X
  %variable  指定一个单一字母可替换的参数。
+ _) q0 M; z- `  (set)      指定一个或一组文件。可以使用通配符。/ Y$ [1 t; X6 p* }, C
  command    指定对每个文件执行的命令。
. Q5 k- [4 Q, r" q3 n8 e" @  command-parameters
1 d5 }2 S, n% [$ j3 _             为特定命令指定参数或命令行开关。
# H2 v5 c  Z4 D
4 ~7 ]$ ], k' k$ t# {在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
( r% N; s1 M$ @而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
- m2 ^0 K4 T6 O/ G
9 x1 E- u0 y$ }# ^如果命令扩展名被启用,下列额外的 FOR 命令格式会受到* `( G$ D7 k' _2 c+ ?6 c
支持:9 R7 Y: l; x* ?+ [. f4 ~/ n
" j) l% a8 D' g7 i4 V) g. s
FOR /D %variable IN (set) DO command [command-parameters]7 l" G; i/ C' I- E: `# M/ }, l, ^! x
/ C4 n) T( J/ Z; m; Q# `( j$ f
    如果集中包含通配符,则指定与目录名匹配,而不与文件
0 [" q. q  Y9 L2 B# r    名匹配。
- g+ K# `$ s8 ~, M& D) e
; g- g$ t& g" f4 y8 d6 n! e1 ]1 Q$ ]9 zFOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]# a5 c9 \) m* G! j# i
5 a1 M+ o7 u' C5 f  k' U) t$ @. ?
    检查以 [drive:]path 为根的目录树,指向每个目录中的
" i4 q7 H! m" x% n) C  H6 R2 q% {    FOR 语句。如果在 /R 后没有指定目录,则使用当前6 ~. C, o& l* b& l# k: e6 A
    目录。如果集仅为一个单点(.)字符,则枚举该目录树。' @3 {$ i+ _+ b1 C/ E

; Y0 W8 o3 c6 t, E# eFOR /L %variable IN (start,step,end) DO command [command-parameters]
+ |4 j$ B5 s. a4 e! u$ ?' T0 K
7 Z! Q/ _: p4 k    该集表示以增量形式从开始到结束的一个数字序列。& l; J  @& }4 {* L2 z/ {! U. j
    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
, z1 v8 R( k9 ^    序列 (5 4 3 2 1)。
0 c0 _2 G% V; Q5 X1 ~' D; \% h/ F
( s2 x: d8 }4 u8 O3 j0 U" kFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
2 h( Y* n$ p. P2 _* nFOR /F ["options"] %variable IN ("string") DO command [command-parameters]* B" r- `/ w( Z$ e- f
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]# v: k# R4 Q+ C8 R
0 N( X* S9 \: d2 R8 O/ ^/ h
    或者,如果有 usebackq 选项:
% P9 h; h) @# X4 S3 r
& D/ r2 L' K8 ?  }7 NFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]: w' A% w6 K: j# ?& b1 M4 v5 h
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
- o4 K; G" j1 \& i  }0 @FOR /F ["options"] %variable IN ('command') DO command [command-parameters]6 Q* L  e- b8 U/ ~# E7 V+ P
2 u' {' s5 a& h) R8 v. @0 P
    filenameset 为一个或多个文件名。继续到 filenameset 中的3 ?7 ?$ r9 F/ K9 A2 p
   下一个文件之前,每份文件都已被打开、读取并经过处理。' S9 a0 b. {: _
    处理包括读取文件,将其分成一行行的文字,然后将每行
  E: ~5 O$ `4 F0 l# p/ u- u    解析成零或更多的符号。然后用已找到的符号字符串变量值$ m: F) i8 c+ w- K$ M
    调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
+ m# y7 M: ]% C7 \9 ?& v    的第一个空白符号。跳过空白行。您可通过指定可选 "options"
! }8 a" U1 t2 Y" l! q    参数替代默认解析操作。这个带引号的字符串包括一个或多个8 p% ~- F6 b- R8 ?
    指定不同解析选项的关键字。这些关键字为:/ g) T- Z& ]$ V4 A# s

0 ^5 W5 ^  l1 _! [) c        eol=c           - 指一个行注释字符的结尾(就一个)$ F. C! {% h0 w1 ~  [% M
        skip=n          - 指在文件开始时忽略的行数。
; v) p0 x. S; ^$ a, K: h' }. d        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
) q1 J; X8 y: U3 h3 [                          默认分隔符集。% V4 g% l1 e- p' I, \+ E* H
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
" G. O3 l+ b  v                          的 for 本身。这会导致额外变量名称的分配。m-n$ [2 e+ n* h" P' }4 J% I
                          格式为一个范围。通过 nth 符号指定 mth。如果
7 L7 Y! k: y  ^. z                          符号字符串中的最后一个字符星号,
3 i4 q' U1 F4 j+ ]9 W0 X# ?8 U                          那么额外的变量将在最后一个符号解析之后
  w6 Q! J8 W1 ^) u                          分配并接受行的保留文本。. f; A" K9 V$ r0 r6 B
        usebackq        - 指定新语法已在下类情况中使用:                    " S* F* E6 O5 s
                          在作为命令执行一个后引号的字符串并且一个单
# [9 q5 S/ Z. _9 M' O                          引号字符为文字字符串命令并允许在 filenameset
! ^* P6 L" T+ }$ @& g                          中使用双引号扩起文件名称。% B% q" z8 y3 k# k' o& t

, V7 A5 I* ~8 [/ U    某些范例可能有助:
/ H, j; Y* o' ^' r# e
, G( ]) ~1 n0 M: v% eFOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
. C& O6 N" Q+ Q7 O
2 v' h. H5 J: t' ^6 Y4 `& `    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
: y6 Z9 a% ~, T6 }" q- E) h    每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
; w* z, k  j% g2 z& q- C* C7 V, y3 M  u    空格定界符号。请注意,这个 for 程序体的语句引用 %i 来5 j$ Q+ ~; x- s( z3 I  X: [' U
    取得第二个符号,引用 %j 来取得第三个符号,引用 %k
* G+ y% }. s9 K+ }: d    来取得第三个符号后的所有剩余符号。对于带有空格的文件
% }- H' W- _5 T) }  T. A    名,您需要用双引号将文件名括起来。为了用这种方式来使- w5 t+ {1 Y7 `2 x. h: _" y
    用双引号,您还需要使用 usebackq 选项,否则,双引号会
6 A3 o  v- u+ N" Z  J' s    被理解成是用作定义某个要分析的字符串的。
" s0 p% j6 Q8 Z. ]
2 p; D$ i) Q' u6 W0 [% {  k    %i 专门在 for 语句中得到说明,%j 和 %k 是通过0 ~0 r! y5 Y. w
    tokens= 选项专门得到说明的。您可以通过 tokens= 一行* G& w- X5 j: y6 D. n
    指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
1 Y# Q- X6 I6 \; m0 L4 q  J  c( V0 E    'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,( I" Y# C* l& v4 h( G2 n
    同时不能有 52 个以上都在使用中。* d4 ~( p3 K6 d' D

2 c+ g/ S  J2 G; a    您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
( b7 d3 {+ e0 n" k8 E1 D4 g    用单引号将括号之间的 filenameset 括起来。这样,该字符8 T5 k' z& t( }: l! F6 A
    串会被当作一个文件中的一个单一输入行。
6 C- n% x2 G) p& K8 T
0 \0 }+ [7 Q  o) l/ y% W: v    最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
4 Z( @6 h9 M; I0 F( S. @4 e    括号之间的 filenameset 变成一个反括字符串。该字符串会
/ n: Y" K  X- M8 S, k2 Z! i& w    被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进  k7 a1 j% [! j; h! S$ b9 V
    内存,并被当作文件分析。因此,以下例子:5 O( f4 H# }7 E
' U( e& K& a# u9 f. O) Q
      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i* ?0 R) E; N2 r& w9 \

8 r5 L0 v7 O' t6 [* A6 F    会枚举当前环境中的环境变量名称。
/ x$ }, I) U2 B2 I/ m- H( t
. G" @: q# g. Y* x, r2 z* [/ C另外,FOR 变量参照的替换已被增强。您现在可以使用下列
# a/ p" z& t9 z$ ]1 {8 a) q# t选项语法:4 f; F' U0 ~5 ?- ?8 f  d
. v: s/ |0 b5 w( j
     ~I         - 删除任何引号("),扩充 %I
: f' l9 m. {4 \" ^) U     %~fI        - 将 %I 扩充到一个完全合格的路径名
! y; L$ H. T1 `     %~dI        - 仅将 %I 扩充到一个驱动器号& l  g, x- u  q" e; }
     %~pI        - 仅将 %I 扩充到一个路径
- R; Y" o% J% z5 x     %~nI        - 仅将 %I 扩充到一个文件名
3 }0 F" A; L+ K. c& z2 a     %~xI        - 仅将 %I 扩充到一个文件扩展名
* T3 c% K# X" V9 ?. s3 |5 M/ o9 X     %~sI        - 扩充的路径只含有短名
4 g' ?/ z6 Y2 c9 f- Z     %~aI        - 将 %I 扩充到文件的文件属性, ]% [( d9 u; t8 F8 }
     %~tI        - 将 %I 扩充到文件的日期/时间4 m" l5 h; r; i& z% T" u; R+ s
     %~zI        - 将 %I 扩充到文件的大小3 h/ x# J4 a  I5 {7 z' w
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
/ L$ u- M6 i" m7 N5 H                   到找到的第一个完全合格的名称。如果环境变量名( `/ k4 ~+ }* `; h3 Q
                   未被定义,或者没有找到文件,此组合键会扩充到, r1 X; b6 {8 X# d6 u" H" H
                   空字符串, p' a1 x5 Y) j' M0 i" c; x# Q
, H+ n6 \- z( _0 ?
可以组合修饰符来得到多重结果:
# \) G6 W  ~% w" G( u0 D: B' s) _: j# v6 b
     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
, Q* `9 m" I$ N& {4 \- S     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名6 ~+ a1 P3 c' I5 k7 d! Y3 Q* Y
     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
* }! p( U$ v3 o, r9 @7 f     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充; @7 u, s4 R& \. r- f" [! y
                   到找到的第一个驱动器号和路径。
# V# v: V8 i5 X9 }8 z     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR
. _+ i6 {3 @+ l( X0 x8 R
3 D8 ^$ W+ b& v+ v4 M9 m# A在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法8 h/ N5 C  g2 \' D2 `: A
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名, [; {" k7 ]) t3 `
比较易读,而且避免与不分大小写的组合键混淆。& }7 ~3 o. I  m- S
( ~6 ?6 }9 c1 {$ C4 ^5 G
$ K# U% P" K% i# R9 D* q- D
---------------------------------------
2 Z' F. _. c. r9 u/ B转自 http://www.cnblogs.com/tanzhiwei/+ `' X+ {& L2 q' U3 Q
  M- Y$ `) w/ P' t2 e
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ]

评分

1

查看全部评分

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

本版积分规则

 
QQ在线咨询

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

GMT+8, 2025-7-11 18:04

Powered by Discuz!

© 2001-2025 eimhe.com.

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