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

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

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

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

[复制链接]
发表于 2008-11-28 12:13:17 | 显示全部楼层 |阅读模式
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决+ p! u0 `8 O" j  Z  w
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.0 P6 _* L% t* t" K4 e4 v
DOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:, ]9 N" U: T& i+ D+ H
for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
5 G9 k1 B6 D' z7 d4 d这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.& {, t  U9 f' ~  H1 _5 g
/ i9 K) l3 S- e( ~3 `& x% j% ?

9 R4 J! @# N7 U, P! m- F* h& N7 ~; e! |) W# P: \' [! L5 L( P+ }

' s0 M, ]0 p5 g5 u$ I' X! k9 {' r" \

5 u  ]) N$ V2 H# ^$ y! B1 J1 ?0 G
4 I' U% n5 U4 Z9 C9 {5 i4 V7 t对一组文件中的每一个文件执行某个特定命令。$ p+ `" O: ?9 F" b$ ]7 y9 q
+ \% u+ p' p( }* W; j+ H
FOR %variable IN (set) DO command [command-parameters]/ j2 _; J8 |4 n5 C( s' C' q* ^) g

: u! f( ^, Z% p2 `6 l3 X  %variable  指定一个单一字母可替换的参数。
% b2 Y& A8 Z, g  (set)      指定一个或一组文件。可以使用通配符。2 j, L! |: c- I- t) `
  command    指定对每个文件执行的命令。
3 z. G; D+ z5 S% s: F  t* e  command-parameters
( I1 ^0 Q. X! W, F' s1 R5 w% }0 O             为特定命令指定参数或命令行开关。
# P( G4 X3 ?4 b8 u* a" e0 o( I7 s0 v
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
( G2 t- ^- _  u而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.! ?. }  k$ V% H
( l& \2 A* R* k  x* T; P( I
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
3 |& J2 c( @  u- @- X# B支持:
. N& g0 t$ t, @- n
9 y1 R& |/ u' T! H7 V7 mFOR /D %variable IN (set) DO command [command-parameters]
& b* O( O, o5 J# W# `+ c- n4 A  i% ~/ a) Q3 T0 S7 }# V4 s
    如果集中包含通配符,则指定与目录名匹配,而不与文件# v# c" G* f8 ^
    名匹配。
2 w; I2 B1 Z' v+ n! K  b) K  H/ c* M, N9 m: o
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
& M4 _# y) O, S" s, A0 W. d/ d. F2 r# E
    检查以 [drive:]path 为根的目录树,指向每个目录中的: e- i% u! r% d0 L7 K5 d
    FOR 语句。如果在 /R 后没有指定目录,则使用当前3 A8 s' A# v6 G# Q& h8 n
    目录。如果集仅为一个单点(.)字符,则枚举该目录树。! J( O$ C7 w1 N
- ]/ x' |0 d7 l$ i; @
FOR /L %variable IN (start,step,end) DO command [command-parameters]. M9 J' k) d9 i: C
8 w9 y! ?% x: D
    该集表示以增量形式从开始到结束的一个数字序列。
  I: E9 k( _9 R; `    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
$ Q, g* c. \3 E& p8 D" k9 F* ~    序列 (5 4 3 2 1)。
. a+ X- C8 n$ |. a5 \! t- E  r% u" D
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]# o' R: ~6 Y* ~' r& R
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]) c9 l6 n4 L1 M5 N+ f6 {+ c
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
3 A+ s- g: U( C! e* |
- A- E' X+ d0 g! L    或者,如果有 usebackq 选项:: i3 v# A: H* x* A, ^  ?

, L7 ^$ ?& {+ }- x+ wFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]' ]$ b' U* }  H6 N/ f' }0 `
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]1 q- T' z3 k( h7 f7 _8 V2 L
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]; O5 U* h5 P, R8 A
% K- Q6 w4 D/ K" G! Z5 N. r" F+ A* H
    filenameset 为一个或多个文件名。继续到 filenameset 中的
3 N' }) x* x$ Z- i; d$ D% x+ F   下一个文件之前,每份文件都已被打开、读取并经过处理。! ~) e9 W2 x) |7 F- G
    处理包括读取文件,将其分成一行行的文字,然后将每行
0 W5 T/ \5 A9 i; @+ u    解析成零或更多的符号。然后用已找到的符号字符串变量值1 i" E6 N) l% w
    调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开- C! P- a1 D3 I6 y2 O% H4 e: A
    的第一个空白符号。跳过空白行。您可通过指定可选 "options"
; }, e( P* n: Y    参数替代默认解析操作。这个带引号的字符串包括一个或多个7 G) m  I8 B4 D) W9 U
    指定不同解析选项的关键字。这些关键字为:
- Y0 O* u/ ?+ u! E( L2 S
+ [) e) |$ e4 X" i( K2 I' v        eol=c           - 指一个行注释字符的结尾(就一个)' M; j: H" P' x2 p& h% B
        skip=n          - 指在文件开始时忽略的行数。1 f! o2 a0 j7 T2 {8 c
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
* I9 C9 e8 D! O/ M                          默认分隔符集。( K5 L4 M( p+ v' @8 g/ z
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
0 t. }4 Z3 s- s; j                          的 for 本身。这会导致额外变量名称的分配。m-n1 ?# s5 O- L# k9 T5 R
                          格式为一个范围。通过 nth 符号指定 mth。如果% e. \7 B5 E. a: H; J8 d8 P# y1 S* K
                          符号字符串中的最后一个字符星号,
1 a" o/ s$ ^# Y$ t5 G' j5 l                          那么额外的变量将在最后一个符号解析之后
, C! Q/ u' S0 B8 ?5 R  ~                          分配并接受行的保留文本。
+ J- ?3 S. y* a        usebackq        - 指定新语法已在下类情况中使用:                    - W+ ~, w' z! t
                          在作为命令执行一个后引号的字符串并且一个单  t8 K6 P, d) f: S4 ?2 N
                          引号字符为文字字符串命令并允许在 filenameset
! U2 z- X" N; |" }) o                          中使用双引号扩起文件名称。1 N4 d/ V9 v- w( d1 G. H

' S8 s8 q* K; e$ [4 t    某些范例可能有助:8 J, j: G' Z: E/ K

. D& W& G" l* @+ l5 BFOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k: h8 D/ U! e9 j- g2 R/ ?: L

# X; V9 P) H! u9 t) j$ _    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将1 j( U2 j4 R( w7 X# o3 Q
    每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
2 y$ ~/ [( K9 p) x1 s/ q+ c5 ^    空格定界符号。请注意,这个 for 程序体的语句引用 %i 来% @  ]( h% w; l& g3 u; l
    取得第二个符号,引用 %j 来取得第三个符号,引用 %k+ g; k0 s* ?* a: l" _, O: {
    来取得第三个符号后的所有剩余符号。对于带有空格的文件
% _/ M+ Z7 e  Z1 D    名,您需要用双引号将文件名括起来。为了用这种方式来使
$ c5 K0 o% V* d0 w+ h    用双引号,您还需要使用 usebackq 选项,否则,双引号会
3 s- U8 n! N* P3 r. Q% Q3 w    被理解成是用作定义某个要分析的字符串的。8 ~* n& c0 A+ b- Z
. R" B9 I: \; I9 k
    %i 专门在 for 语句中得到说明,%j 和 %k 是通过4 k$ B3 c5 \: c
    tokens= 选项专门得到说明的。您可以通过 tokens= 一行# ]7 s7 [: C4 n# k" D. J# z
    指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
9 @+ F  k* Z8 k* L5 d    'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
: d: [' E; J- u1 S5 }/ G7 _3 Y, `. @    同时不能有 52 个以上都在使用中。5 K- U% T6 }* o
$ H) K  u# F  i: A7 F
    您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
' h) @1 W% C! J/ z9 [& ?+ j. B    用单引号将括号之间的 filenameset 括起来。这样,该字符- h% l3 F3 R5 B# Y5 G
    串会被当作一个文件中的一个单一输入行。* D" z! a) z# `" i7 _4 x6 z/ q4 H
4 e1 B: B; p+ }5 n, Z# _( Y
    最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
: |3 V5 G. M0 h    括号之间的 filenameset 变成一个反括字符串。该字符串会
  i+ r5 Y  U$ }: l" v; T4 |! E. ]    被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进' r9 e  E" u3 t6 ~, ]( M
    内存,并被当作文件分析。因此,以下例子:
. }: r  `/ e% U
& q' ~& {( ?: v9 [- ^      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i, f8 L* t- h' y# z6 G: p1 k8 P

0 y7 N5 ?) _. [5 `" g" i2 I  q    会枚举当前环境中的环境变量名称。
" \. `  o% F* v- C
0 z+ c8 \3 h0 l- @( ^5 B另外,FOR 变量参照的替换已被增强。您现在可以使用下列
* H4 C& E7 R/ Q8 u9 C( ^1 ?选项语法:' F( l7 k! f2 R" ~7 z# |, p. {& \
, z8 n/ K% h- R+ b
     ~I         - 删除任何引号("),扩充 %I
- T' ]$ [1 ]2 i     %~fI        - 将 %I 扩充到一个完全合格的路径名6 `# @5 S9 [, ~8 p& E0 _6 w5 m' t1 F4 E
     %~dI        - 仅将 %I 扩充到一个驱动器号
# f2 {: ]* Q  G) c     %~pI        - 仅将 %I 扩充到一个路径1 e& M2 B4 D$ u
     %~nI        - 仅将 %I 扩充到一个文件名
& ]  w( a( X+ }4 K4 }3 S     %~xI        - 仅将 %I 扩充到一个文件扩展名$ ^+ z& K9 L% H6 p) _
     %~sI        - 扩充的路径只含有短名
8 K) F2 X# g3 X  q     %~aI        - 将 %I 扩充到文件的文件属性
; o& A' w& a- Q2 ]     %~tI        - 将 %I 扩充到文件的日期/时间( V6 Y4 ^0 v6 v
     %~zI        - 将 %I 扩充到文件的大小# w$ `6 L) O7 W4 O( c6 e# R2 s
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充& h5 M& }  e3 M1 Z/ e! P
                   到找到的第一个完全合格的名称。如果环境变量名& j* V8 @: ?# i3 W$ X
                   未被定义,或者没有找到文件,此组合键会扩充到
' A4 U# r, B+ k0 Q6 t& H3 ?                   空字符串$ s. _7 ?" C, n, v7 ~

+ `6 M& k3 v( w9 `; c% |可以组合修饰符来得到多重结果:
; `2 y# L+ D2 V
6 L. x, ?5 {3 }0 G9 K. Q3 t     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
, r/ V3 Y  W' J/ ^4 U: @     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
: X" Y' n+ c9 ~7 @( i7 b  ?& }3 s     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名  G' h/ h$ c5 z6 I/ L
     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
+ @- M# G6 `! u/ Y2 T) k* p: {1 [                   到找到的第一个驱动器号和路径。
- l, d- }! {) f% [+ d! f5 n     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR$ ~6 r1 u( g! l& q; B/ u# W

% L" C4 w1 l# l( H5 I4 v在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法1 G7 h: [* S; G3 H# V4 O/ \
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
7 n0 h2 B7 c6 [比较易读,而且避免与不分大小写的组合键混淆。: `4 L9 Y% L7 c2 o! `

  t- y3 c- ?1 l- n; t) P- z& \7 \4 `+ z5 R' k' r3 f
---------------------------------------
( [5 {/ W- F) A. V2 ^, v* P( }转自 http://www.cnblogs.com/tanzhiwei/% D. c& f1 M7 v7 x3 Z: h) E

% J3 z$ l( A8 B9 C( d; Q' w[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ]

评分

1

查看全部评分

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

本版积分规则

 
QQ在线咨询

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

GMT+8, 2026-7-30 22:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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