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

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

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

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

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

5 K) X# k: T: ]5 l1 m$ ]+ P4 c  s3 ~! t2 X: _1 D  K2 a0 A
5 C7 E; T* s2 I1 \

0 k6 L3 j9 U7 S  Z# L' M( P) Y3 q2 W8 |; u5 A

0 a4 b* M' i7 D. F) M对一组文件中的每一个文件执行某个特定命令。+ W2 a6 L+ D" g/ j* L7 S( a

( o7 l- E6 }3 Z% H& m8 \" XFOR %variable IN (set) DO command [command-parameters]
% k; p6 |+ j% x5 f. c( F/ K# d
( _7 q3 X' X7 y3 E  %variable  指定一个单一字母可替换的参数。
1 i" |3 l/ L) _( ~  (set)      指定一个或一组文件。可以使用通配符。
$ B1 s( o* B/ G5 K. X  command    指定对每个文件执行的命令。& u1 w, a- T4 r# K6 R; p8 O( w
  command-parameters8 V2 k4 Z+ e  `) }! b" k4 }
             为特定命令指定参数或命令行开关。
$ e$ X$ v, F. ^. d! t! A0 J/ V0 l2 h. ^& B/ I0 }
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable $ s6 y7 D% [8 {5 D9 F& c1 a
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.6 E) H9 Q1 \9 u0 E! k% {
( E- ?/ H) s0 }3 p7 G0 X
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
0 F3 S# K) @  W0 J& N$ n# {支持:
7 |' g  y/ \+ V- g* o
; {/ b) Z% U4 X% Y8 D0 `; {FOR /D %variable IN (set) DO command [command-parameters]% L$ g% H' u6 y% j5 Z7 F$ [6 v2 N
7 A# T% N1 X9 V) _
    如果集中包含通配符,则指定与目录名匹配,而不与文件
* a5 g1 t0 Q7 E    名匹配。
2 L& |& K& ^2 H2 x# N' P; k2 t2 o% c! ~  Y  g: c# }: I
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]* j  L& N7 g. X: b& O0 U, h

( |0 @" j) @/ L7 C  _$ a    检查以 [drive:]path 为根的目录树,指向每个目录中的
/ u& ?3 y0 o+ H$ K3 [! H- _    FOR 语句。如果在 /R 后没有指定目录,则使用当前4 q6 o6 h- u: x5 o
    目录。如果集仅为一个单点(.)字符,则枚举该目录树。
+ e  x# E+ m4 q! c
4 ?  }) {# c6 Q4 D: Y4 K: MFOR /L %variable IN (start,step,end) DO command [command-parameters]* u& b! j* m! y- W- x; Q

7 Y' X- q3 W" a) X: H1 c    该集表示以增量形式从开始到结束的一个数字序列。
! j) m' F: b) F: d% H* w/ E# x    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
. Z# w( i  \6 m    序列 (5 4 3 2 1)。
2 ~5 @# }, B5 n7 p2 t/ @  L' C6 W  s7 G; ~
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]% v0 V0 N1 g: Y. T6 W
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
9 q! h& C' O. j$ d8 K" G% DFOR /F ["options"] %variable IN ('command') DO command [command-parameters]
: E4 ]$ k# ~; R# v7 ]" ?' I$ F
& o: T6 r& V# N5 \9 ?8 I% E. l- W2 a- ]    或者,如果有 usebackq 选项:' K) P7 h6 Y( I/ a& h8 l
" J& y& ?2 \6 H- {& S' |; ]6 ~
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
  R) y+ Y' p: M6 JFOR /F ["options"] %variable IN ("string") DO command [command-parameters]& T1 ]/ Y$ i) V+ s; l1 B/ ]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters], C  h( w; h& U0 s7 q0 K/ l% I

6 h( \/ a* v0 F% p0 x& y# w    filenameset 为一个或多个文件名。继续到 filenameset 中的
" C# _$ r0 w" s4 G   下一个文件之前,每份文件都已被打开、读取并经过处理。
. v* h7 c( y; u4 V7 ?    处理包括读取文件,将其分成一行行的文字,然后将每行
) E$ m! A4 s8 z    解析成零或更多的符号。然后用已找到的符号字符串变量值& c. K& W7 K) o$ V; F+ e( H( N
    调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
0 z0 W- Y. U  z# L0 n    的第一个空白符号。跳过空白行。您可通过指定可选 "options"
' I; V" R$ y5 Y8 Q5 |8 ]    参数替代默认解析操作。这个带引号的字符串包括一个或多个! N8 P% J1 ~6 G
    指定不同解析选项的关键字。这些关键字为:
& b8 y$ B7 o3 G2 G3 d# U' e+ b3 g, r: F* O% n
        eol=c           - 指一个行注释字符的结尾(就一个)
2 [, `; H- I$ m. u1 L        skip=n          - 指在文件开始时忽略的行数。/ l, X9 X/ Y/ h3 [1 L% u
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的' w( N+ s9 K' x& ~7 f( u! N
                          默认分隔符集。
# T! [4 N+ [2 j" E+ D3 Z        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
- c7 r3 `3 C5 c                          的 for 本身。这会导致额外变量名称的分配。m-n  h2 t) r& K! R: P9 \9 w9 ~/ i
                          格式为一个范围。通过 nth 符号指定 mth。如果( g- G* Z* e1 I( m4 D% @' k8 l
                          符号字符串中的最后一个字符星号,) l+ S$ Q# k& e! r
                          那么额外的变量将在最后一个符号解析之后
2 j4 _3 w/ O8 Y& m7 [  E                          分配并接受行的保留文本。0 L$ d: T0 S6 k1 v' O
        usebackq        - 指定新语法已在下类情况中使用:                    
' W( t) M4 ~' `/ S; w% }. |                          在作为命令执行一个后引号的字符串并且一个单( s6 T; v, C- F! S7 E
                          引号字符为文字字符串命令并允许在 filenameset8 @* ~4 s+ m" m1 U
                          中使用双引号扩起文件名称。/ X; H+ W! E+ }4 N2 l
5 R7 z6 j# o# s% S
    某些范例可能有助:) P- I+ a. [/ [) h0 f# b" k

2 n+ z" H- V- m7 n6 i% UFOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
9 O" w+ E& k: O/ Z# X) W( N7 f0 c/ n& p5 Z* R
    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
# @  b" i+ t- [% V    每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
, i$ U- W" w, z  p8 \1 Z+ I    空格定界符号。请注意,这个 for 程序体的语句引用 %i 来: w! v% J! I  M" q. \8 b; }
    取得第二个符号,引用 %j 来取得第三个符号,引用 %k
( D2 i% ~  K- y; ?9 Y% f    来取得第三个符号后的所有剩余符号。对于带有空格的文件
) i3 ?* g5 Y  |7 _( k    名,您需要用双引号将文件名括起来。为了用这种方式来使
7 @! x" Q( ~. s" o6 _8 U    用双引号,您还需要使用 usebackq 选项,否则,双引号会6 [; \( F2 _  g1 S$ y- F7 n
    被理解成是用作定义某个要分析的字符串的。7 u" Z5 e2 y& `! f7 o
( W+ w  t2 i9 u3 `4 G8 H
    %i 专门在 for 语句中得到说明,%j 和 %k 是通过! ^9 d2 {6 ~- V7 X
    tokens= 选项专门得到说明的。您可以通过 tokens= 一行
% c% Z( Q4 o9 @! o0 Q6 m% V0 z    指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或8 s* E# e# w) |' y& `5 J* v7 d
    'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,. V8 X6 K" w3 s$ w; E
    同时不能有 52 个以上都在使用中。
8 q+ n, U2 w% L0 g6 I
' A8 H: n! O4 R2 Y: V1 q( S, k    您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
7 S2 |6 Z; ^) H- m) u    用单引号将括号之间的 filenameset 括起来。这样,该字符" Y, b& k# Z( M9 z1 a
    串会被当作一个文件中的一个单一输入行。
5 J- \( W7 `* G' `$ y9 p  q0 u; t; Y& c
    最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将7 \2 H( ?- L7 w3 Y. @
    括号之间的 filenameset 变成一个反括字符串。该字符串会5 ~1 ^( P, Y8 u6 I
    被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
( t/ w9 U! @, J7 c& a, Q    内存,并被当作文件分析。因此,以下例子:
; {, ~& p; r# h- Q7 a; e9 y9 C, G* R* z( {, U- k6 h2 J
      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
) n' h; f' l1 t/ {0 H% h
: P9 \8 N2 B' f  {1 ?8 ~5 i    会枚举当前环境中的环境变量名称。) @1 i" w2 G' L0 p# L9 H
- X0 a0 H( c& o
另外,FOR 变量参照的替换已被增强。您现在可以使用下列( w) [7 b" g4 h! H" E: _8 P/ f
选项语法:
9 c4 u( E7 ^: Y2 y( A1 }! m( o2 k/ @' T
     ~I         - 删除任何引号("),扩充 %I) W2 ]1 R2 ^( C; d# n9 \
     %~fI        - 将 %I 扩充到一个完全合格的路径名
( @3 q: J% B" `: B* b     %~dI        - 仅将 %I 扩充到一个驱动器号; Z" }3 J) b9 M! L$ \& ~# q* K
     %~pI        - 仅将 %I 扩充到一个路径
/ H9 C1 J8 F& |1 _     %~nI        - 仅将 %I 扩充到一个文件名
% t% W* M4 f* o2 I5 J( }     %~xI        - 仅将 %I 扩充到一个文件扩展名
  {4 B- f! w& Z- W( l! N     %~sI        - 扩充的路径只含有短名
; L$ V2 J, ^+ S9 L" n+ C3 w     %~aI        - 将 %I 扩充到文件的文件属性
8 N  v: m; L3 A" Q     %~tI        - 将 %I 扩充到文件的日期/时间
) l- m# h) Q" I     %~zI        - 将 %I 扩充到文件的大小6 s: I. x5 W+ o* h6 f# d; H& e! y
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充: g" [# q. b3 b; e! F* d
                   到找到的第一个完全合格的名称。如果环境变量名9 e9 Y! T! k) y: f' `
                   未被定义,或者没有找到文件,此组合键会扩充到
  J! E% g4 k4 F                   空字符串
: C1 s9 z3 R: [! ^: M, n) m0 l( Q- t5 J4 t
可以组合修饰符来得到多重结果:
0 p0 c- r1 o' }8 d: [1 t$ C' F  M
' O2 c% B/ D. W: z9 d, ^3 E     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径2 E/ J- W, Q8 W
     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
* e4 Q# ?( A% K! X     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名/ l9 j& ?( H0 X8 M
     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
4 H6 T3 |" W7 {- |                   到找到的第一个驱动器号和路径。
0 o9 y! ?. ]9 q3 F0 A: ~$ J" k     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR
* ~( W( P+ O% t/ ?. J3 X
8 g" }4 ]3 B. Q* T+ V在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
3 v, o2 D. ]/ ^" r- F0 ?, o% s用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
3 X- I& m; K2 K) O6 e比较易读,而且避免与不分大小写的组合键混淆。
8 N% B/ T) j% `1 h7 S6 @. I) _* R* e9 `5 R6 F. a$ H

6 _% C! S, C* V$ R---------------------------------------
. h+ p2 U5 k/ J: d7 N转自 http://www.cnblogs.com/tanzhiwei/. i' p8 w8 I( j. R1 w5 N% V) B/ B
0 y# e# V1 z2 m1 H/ k
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ]

评分

1

查看全部评分

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

本版积分规则

 
QQ在线咨询

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

GMT+8, 2026-6-14 08:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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