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

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

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

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

[复制链接]
发表于 2008-11-28 12:13:17 | 显示全部楼层 |阅读模式
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决  D! V4 N- Y6 U! y  X4 d* w2 h
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.
# `, [* C+ ]" t! h& k4 c& gDOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:  ~! U. r" g- z  Z/ Y
for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"7 B- p, F* z( l0 P9 }5 O- X
这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.+ k& N, d- k4 w: K/ ^. G7 C
2 f$ t  \! \% }# h- ~& d
  U7 M+ d; C( y, I) j

" z- R/ h. ?, v2 [# s- S3 }! \2 J) W  A3 G! N% {+ J
9 H. L8 w& v/ c, ~6 r

! c( D: {: M! z; Q* c& w
: h: r+ V4 i% j对一组文件中的每一个文件执行某个特定命令。
/ ^( D; T. @: s2 N5 d
7 J2 P. Y) t; y1 b/ J* gFOR %variable IN (set) DO command [command-parameters]7 G* h) ]7 |8 Q+ L/ g  f$ I

* ?5 V, l) w7 \  %variable  指定一个单一字母可替换的参数。
. K7 t  K8 s/ [; C6 r, F2 Z  (set)      指定一个或一组文件。可以使用通配符。# H1 E, O" X) t+ p- c- U6 Z
  command    指定对每个文件执行的命令。
2 U7 M- b9 _) E5 y% n  command-parameters
$ V9 z4 v8 n; U, u0 ^3 b             为特定命令指定参数或命令行开关。
- ~: v* y* @3 ^
/ s4 F) A: z. U) n' W在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
8 \- A7 S; w& j1 U/ g5 ~而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
8 Q0 |* _- ?9 c- H- ~! e; X2 J0 W' @; G: e  F+ ]
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到* D% l  p) X, e- l
支持:3 ^: x  ~( v5 v9 u& o. V

" b; m# Q) u# W. yFOR /D %variable IN (set) DO command [command-parameters]; m, J% m2 C4 l
! N: J6 z# h, h* ~
    如果集中包含通配符,则指定与目录名匹配,而不与文件/ |; Z6 X3 G; }! T5 t3 B8 k
    名匹配。1 Z- o6 d1 k" W, J6 Y& G# i% h
+ H# A8 N0 D0 J7 \/ h! G
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters], s' i6 L! L4 o/ ^, E
# ~3 {+ ?- [. q6 g* [
    检查以 [drive:]path 为根的目录树,指向每个目录中的2 y5 o8 ]+ c' R2 T" f! I  p
    FOR 语句。如果在 /R 后没有指定目录,则使用当前6 G* [% d. l, L- |
    目录。如果集仅为一个单点(.)字符,则枚举该目录树。+ b/ J% A7 Q! n( u

. i2 W1 L- k" b+ h* M  p% bFOR /L %variable IN (start,step,end) DO command [command-parameters]
( [# _% [1 D0 i$ `6 @1 Z, s
( a; b) a8 \+ s6 D) h) G! i    该集表示以增量形式从开始到结束的一个数字序列。6 n" K& W/ h2 w& R( X0 t
    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
4 O5 P) g+ q# r1 z% y. {- x    序列 (5 4 3 2 1)。
/ D' v" s& s) b- `8 u. S, p! J, ]" Y6 w
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
% u4 U& X% c& r# Q" z7 U' [FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
& n# j! C3 A! r* m. @7 F$ _FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
: a+ G" y3 w* N) @* p7 {4 F( D. O, J3 H1 L
    或者,如果有 usebackq 选项:5 r0 s" a. O: t$ C7 }

, i& @$ y! C2 VFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]) h* [% Y0 T) B/ N5 A
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
, ]1 y# o- X2 g) u% OFOR /F ["options"] %variable IN ('command') DO command [command-parameters]
7 o! @( ?! r. Q+ ]) ^
! M  {1 K0 a  B. q: k    filenameset 为一个或多个文件名。继续到 filenameset 中的
( t- \3 h& C9 ^" u  C   下一个文件之前,每份文件都已被打开、读取并经过处理。
1 A: ^, w: U  W1 N* R# I0 e, \4 F    处理包括读取文件,将其分成一行行的文字,然后将每行
( r2 C% ]8 S1 \+ E; P, ^2 ~    解析成零或更多的符号。然后用已找到的符号字符串变量值
* Q3 k- C$ A) L% ]& {; @' A: O9 a    调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
* q* S$ O# Z0 L0 S/ w& q    的第一个空白符号。跳过空白行。您可通过指定可选 "options" - @; h4 n# C* a: S
    参数替代默认解析操作。这个带引号的字符串包括一个或多个6 L- H$ R" N, ^8 T
    指定不同解析选项的关键字。这些关键字为:
; ~0 H' j# |1 Q) Z  `) X- u- v0 U8 g+ t# A7 ^" }3 M& |- |
        eol=c           - 指一个行注释字符的结尾(就一个)- |$ v) B0 H, b; i& b
        skip=n          - 指在文件开始时忽略的行数。
: }" t7 h2 s' h. _$ A9 S        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的1 K' ]% G4 T6 M) B9 g) R2 Y
                          默认分隔符集。' X" X9 p$ s& q" ?
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
4 n4 y  V$ c* X                          的 for 本身。这会导致额外变量名称的分配。m-n3 w# s; B& {1 G/ _" _$ T7 w4 D6 ^* ?/ o# z
                          格式为一个范围。通过 nth 符号指定 mth。如果
/ z0 D1 q0 q- V                          符号字符串中的最后一个字符星号,. f. Z" o, j# W. p0 J
                          那么额外的变量将在最后一个符号解析之后
0 I! j$ D" s, ^( M6 H                          分配并接受行的保留文本。* W' \- g( D" |) P& D7 O
        usebackq        - 指定新语法已在下类情况中使用:                    $ B' t0 W* L3 p& d. z! [" a  x- {/ Y
                          在作为命令执行一个后引号的字符串并且一个单
+ \3 _3 i9 c- Z! O: C                          引号字符为文字字符串命令并允许在 filenameset, a" w! p  P1 X5 R+ J
                          中使用双引号扩起文件名称。. Y# g3 F2 i6 Z9 |" q) c' y+ r
. B- |' C1 v' _7 z  l
    某些范例可能有助:
9 F  R& Y. _1 ?: O9 L/ a- d/ A; b5 Q7 e: |% e
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
% H6 V0 C9 Y! w- U& O
- _2 Q$ u, s' M, V5 R" b8 e    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将* z0 r. ^# Z5 H1 Z3 G
    每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
$ n" o; T2 C! {* g    空格定界符号。请注意,这个 for 程序体的语句引用 %i 来! `$ D) |- [' X' N' S# I
    取得第二个符号,引用 %j 来取得第三个符号,引用 %k% j5 J; K1 |- h4 Z+ i: {! S
    来取得第三个符号后的所有剩余符号。对于带有空格的文件8 M& D$ h: q" G' w
    名,您需要用双引号将文件名括起来。为了用这种方式来使1 y3 F2 O3 b/ }
    用双引号,您还需要使用 usebackq 选项,否则,双引号会( |3 F" V( j6 W  P+ u& C
    被理解成是用作定义某个要分析的字符串的。+ V- S. p9 @* d+ L" P* l

2 e5 T: Z, ]7 ?- E- \2 `    %i 专门在 for 语句中得到说明,%j 和 %k 是通过
0 o( A+ ~$ s3 s: z  u$ A+ D    tokens= 选项专门得到说明的。您可以通过 tokens= 一行6 |& |  a& c' u8 u4 w: S4 Y% M
    指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或8 p. |0 ^1 E4 P3 T
    'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,: o+ f2 h2 w# P3 n5 J3 G
    同时不能有 52 个以上都在使用中。
+ m6 @+ u* N$ B" H" V/ y- M# V) }$ x$ V; |& J1 b0 o
    您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
: x* x5 d: z; E6 W" T5 _    用单引号将括号之间的 filenameset 括起来。这样,该字符
/ F) ]( c- H, n# Y6 N    串会被当作一个文件中的一个单一输入行。' S: Z% b  J' e9 C% Q# s$ T9 H
2 ~& S. \9 R2 n6 k
    最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将' m; r8 i# Y- @
    括号之间的 filenameset 变成一个反括字符串。该字符串会
4 o4 ]+ _8 M5 Z+ S# m6 Q3 v    被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
: n) z2 j; N$ M6 ~* v2 G4 e    内存,并被当作文件分析。因此,以下例子:; I! }$ @* \4 B2 M8 d$ s

7 E6 c. {+ ], R5 Q      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i8 c" C$ ?; i; M; m- C
3 `$ ~+ j; E6 F) p& x4 f3 \! b) m
    会枚举当前环境中的环境变量名称。8 U  X5 W- |0 y1 @
% b5 e- p1 ~; k
另外,FOR 变量参照的替换已被增强。您现在可以使用下列
0 f& `. ~, `) k0 v选项语法:) p- Q$ g9 h( t

9 a. Y( ]9 |; q4 t6 _     ~I         - 删除任何引号("),扩充 %I/ K1 Z# |, u. q. j+ O6 i* J; _
     %~fI        - 将 %I 扩充到一个完全合格的路径名
0 {9 u4 @/ {, ?( [3 t     %~dI        - 仅将 %I 扩充到一个驱动器号
  x. W" i' D5 Y1 s8 z     %~pI        - 仅将 %I 扩充到一个路径
: _& g( Y6 ~+ l6 Z, o     %~nI        - 仅将 %I 扩充到一个文件名
- g0 w6 }9 E' S  E5 r     %~xI        - 仅将 %I 扩充到一个文件扩展名: U/ E1 h* }" U- ~4 a
     %~sI        - 扩充的路径只含有短名
" q3 R+ H8 X  n0 p* g' b3 p9 c     %~aI        - 将 %I 扩充到文件的文件属性
4 F6 D4 e( Q5 A- z$ ]! g. F     %~tI        - 将 %I 扩充到文件的日期/时间
* E# _1 e) h- C* a" C4 p2 ]; ~5 T     %~zI        - 将 %I 扩充到文件的大小
  T4 S6 P) a5 H; C' x     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充2 q$ [4 ~- C, M. r% Z5 t
                   到找到的第一个完全合格的名称。如果环境变量名
( f2 U* }6 D1 [$ Y9 C  _                   未被定义,或者没有找到文件,此组合键会扩充到
- U* E9 `1 w7 x+ f                   空字符串
. Y1 o& G4 r" O4 L5 H) u0 I* Y. |) }9 p& @* v0 W: M
可以组合修饰符来得到多重结果:5 U5 ^% |- L# J5 G. i
6 c( ~  M5 E$ \- y' J0 m7 V
     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径3 \1 B' ?0 g* }8 F
     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名& ]8 s. y0 ]7 P
     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
0 V% d( k$ M, D4 O     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充! m( `& s' O. Q* r+ r9 X7 a
                   到找到的第一个驱动器号和路径。
. O) V- G4 z3 L5 F1 p, x- Y1 [     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR
0 o) m4 ^9 a& z) M
% G9 c) L6 p3 V) n( h7 l% x3 s在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法, |  p6 n% M* S6 W
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名- A( E6 ?! L/ O( Y7 c
比较易读,而且避免与不分大小写的组合键混淆。
$ W9 Z* C/ P) k- i, V
% c/ v' c3 w4 G& @. T: i/ b) T& H' \* H; F" s- j) r  K
---------------------------------------
" q% `- P- {- Q) w, R% F转自 http://www.cnblogs.com/tanzhiwei/
3 C# |. A5 Y, f* i
5 }2 z6 M0 V+ |6 N[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ]

评分

1

查看全部评分

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

本版积分规则

 
QQ在线咨询

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

GMT+8, 2025-12-10 04:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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