|
|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决
# B" U! X" E3 \6 V1 s不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.
5 _1 l! R; F! R& ]- ]) r) W. Y! IDOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:
$ s; [: q" ~1 F+ |: s! Jfor /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
) U# p2 g7 P% C% t0 `$ \! K7 s这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.
2 x6 M2 W9 L5 f2 d' l& \; t: g1 s
! E! d' h T$ G! z" d. G( g
5 k* p9 Q7 a/ K+ `; L/ T3 A w1 S$ I
# Q. E5 e9 `, G# }" ?4 H$ J
+ }* u& l! ]- {. D- V' l% S1 k' Y4 S
1 q t+ I" t" S: N F: x2 k. r. ]( y: f/ q0 Z4 f, s
对一组文件中的每一个文件执行某个特定命令。# z+ E3 U9 r ]7 |6 B5 B {$ e# [
L! E& E1 O- F/ f8 a( l" o4 AFOR %variable IN (set) DO command [command-parameters]+ v! T: k3 j7 v. c& f0 E
, X. R2 M7 g& T' q0 i
%variable 指定一个单一字母可替换的参数。9 U& w$ W2 H/ M l" D ~$ R
(set) 指定一个或一组文件。可以使用通配符。1 {, O9 n2 V a
command 指定对每个文件执行的命令。8 N* i# ]" G: ?! r5 U: w/ P7 A- L
command-parameters' ?. A9 I7 c3 Z# m. Q. S. d, R
为特定命令指定参数或命令行开关。
" P. S1 s* l# U& [% K5 a6 }( x0 ?2 k* ~: |' s# A: e# e
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
- f9 Z/ ?* k- @# i5 x7 u4 N3 z而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
. r; o+ B5 Z$ M) S; W* c/ P) o$ a
t3 C; U, i5 _! X* }# p0 `1 ^如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
0 O# ]6 ?" _4 ^" N9 h# I支持:
0 f. j# K( ^# m; r7 f" X0 }: l1 J- p+ C2 A4 _
FOR /D %variable IN (set) DO command [command-parameters]
: @- G; j+ ^ z+ g5 V; N8 ^ ^: d, f8 R) A
如果集中包含通配符,则指定与目录名匹配,而不与文件! u0 A' }& y0 R7 w7 {
名匹配。, ]$ }9 B# W, H1 ]- z
( Y8 [* z0 V% S- H
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] t' j1 {) g+ ^. f$ n
& M, ^! b( K _% p, x. K. p 检查以 [drive:]path 为根的目录树,指向每个目录中的
+ t& _+ V$ {3 S* U, l( y FOR 语句。如果在 /R 后没有指定目录,则使用当前/ U6 X# i5 c) K2 S: e. v, L# c
目录。如果集仅为一个单点(.)字符,则枚举该目录树。9 Z$ `( J& g- q
+ K5 L! u8 s9 V+ V9 ]8 F% nFOR /L %variable IN (start,step,end) DO command [command-parameters]$ k5 Z( `4 l8 a, j- S2 K
3 `7 X( ?5 Z) H& x
该集表示以增量形式从开始到结束的一个数字序列。
2 K/ I* h% E: q8 F- x- z 因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
# w8 o1 q5 L0 d S# A& V3 M7 K# f 序列 (5 4 3 2 1)。
% C( [' P4 I% a7 |$ T) _+ b
9 o: ^+ H; p# w J8 ?2 xFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
' e2 `$ H* `" c( a, ]3 t" F8 LFOR /F ["options"] %variable IN ("string") DO command [command-parameters]
! Y( |- ]3 k$ M0 s1 H! wFOR /F ["options"] %variable IN ('command') DO command [command-parameters]
3 S% f( I( [: o8 l1 |. S. ^. z* [
$ l. `" ?4 E7 Z5 e" s" S. w 或者,如果有 usebackq 选项:
5 ?8 `6 o8 K5 F( d. v8 ^- t
; Y1 v, m9 S6 qFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]: N4 x/ f0 b$ z0 Z
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]& t& h. d. N; _/ l) l, A
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]& [5 Y. [. ], Z e; @+ o% F; ]" @2 N* [( c
* w* w, H, b# t
filenameset 为一个或多个文件名。继续到 filenameset 中的4 f3 Z$ Q# f5 N# v* c. S" ^& j
下一个文件之前,每份文件都已被打开、读取并经过处理。) p& k. l2 V! D( D1 h
处理包括读取文件,将其分成一行行的文字,然后将每行8 ]5 a8 `' l' a- p9 i, V& T6 B
解析成零或更多的符号。然后用已找到的符号字符串变量值
2 D8 r: x! r% v- j1 L 调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开" L4 h6 W5 n; v8 w
的第一个空白符号。跳过空白行。您可通过指定可选 "options"
( B6 q( G+ s! p1 L: E* Q) t) ?1 | 参数替代默认解析操作。这个带引号的字符串包括一个或多个
+ F* G* k3 ?2 M0 j7 n 指定不同解析选项的关键字。这些关键字为:5 W0 M3 W7 ~8 ~) r
' ^3 E3 B' Z! G1 M$ ?$ a/ h5 _' p eol=c - 指一个行注释字符的结尾(就一个)0 V& n* I$ b& e" _ j
skip=n - 指在文件开始时忽略的行数。! i( W5 v q- v+ w( X" a0 u
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
! D' Q' p* [3 V M 默认分隔符集。$ H& n3 v- Y( ^2 o( M2 F1 o1 q, k
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代: I: M' r# S) x4 p7 `
的 for 本身。这会导致额外变量名称的分配。m-n
/ s& A4 z$ e) H u4 w* t! Z 格式为一个范围。通过 nth 符号指定 mth。如果8 O' n. e) Z8 M s
符号字符串中的最后一个字符星号,
4 F7 [4 m% q7 ^! q- l 那么额外的变量将在最后一个符号解析之后; G) R- x( d, j) {+ q
分配并接受行的保留文本。0 ^& q- V: u+ v7 Q
usebackq - 指定新语法已在下类情况中使用:
' P+ T y/ q& U& q( z 在作为命令执行一个后引号的字符串并且一个单+ J4 Y+ z) i) d9 U6 E1 e" `
引号字符为文字字符串命令并允许在 filenameset
( U6 ~( b& F8 \ 中使用双引号扩起文件名称。
. O7 p3 K% f3 `) Q
" }* v+ Q, Y. F$ p8 _ 某些范例可能有助:( J5 L1 L# W, x
- x# C! ^) p/ y3 g& VFOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k7 Y1 p, I" n& n. ^
: ~5 Z+ O! B) ~
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
, y3 Y- ?' t3 u2 Q" Q0 g* t: b 每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或' o" K0 m4 n3 m2 p
空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
) ~# l- b, z: Z( i. ?4 k$ Y 取得第二个符号,引用 %j 来取得第三个符号,引用 %k" Y) E0 U! j6 f7 v+ h: t s# v
来取得第三个符号后的所有剩余符号。对于带有空格的文件
' j" P* ]0 h9 f* G' I' E. M5 { 名,您需要用双引号将文件名括起来。为了用这种方式来使0 `& F& c* h& p
用双引号,您还需要使用 usebackq 选项,否则,双引号会
/ O' C; d$ g" X 被理解成是用作定义某个要分析的字符串的。$ C! ~$ v9 j Y
" k9 s4 N& }9 ^* [# }" R. M %i 专门在 for 语句中得到说明,%j 和 %k 是通过
" A3 h$ t- b" A/ E tokens= 选项专门得到说明的。您可以通过 tokens= 一行
9 B3 m ?5 C& Z+ v% G& ^# M1 v 指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
# X+ G9 E2 q& V/ r9 p5 ] 'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
6 D. V ^& c& v ], Y 同时不能有 52 个以上都在使用中。1 y( e) ^$ q5 Z- K% b& r# ]
6 a* H4 R6 s& Q7 W 您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,/ w" P" K; k4 @
用单引号将括号之间的 filenameset 括起来。这样,该字符- B6 @* c" _( z! x
串会被当作一个文件中的一个单一输入行。
& V) y) X$ W7 B) q7 g9 t! U. y
* G _ r7 q+ X; c 最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
: S! J6 Q2 C) N, a% A/ q 括号之间的 filenameset 变成一个反括字符串。该字符串会9 W- o$ y0 N+ \/ W! N
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进7 \. ]$ b1 X- X, S6 z7 M: c
内存,并被当作文件分析。因此,以下例子:
5 P. T; L. A1 j, C: z2 O' \1 V! \( k0 h3 m/ L6 o: `, a
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
9 u2 M# |& d% u. \5 w) L- T6 h$ p( V; ~& L7 B ?9 ?
会枚举当前环境中的环境变量名称。. z0 N' T. m `& ] m
7 k# J, Z1 h8 _! x- Q另外,FOR 变量参照的替换已被增强。您现在可以使用下列
4 Q. I9 V' G- R; t% [* z选项语法:0 Y, r: r6 s' a$ Z# p
/ C6 e4 b7 p. O( R+ C7 B) y3 A ~I - 删除任何引号("),扩充 %I
- z- x+ t5 e/ Y6 M" J %~fI - 将 %I 扩充到一个完全合格的路径名
' w* V1 T/ |2 |6 Q2 v8 T0 I* d %~dI - 仅将 %I 扩充到一个驱动器号( e& x% S8 s/ B
%~pI - 仅将 %I 扩充到一个路径
: K8 T* ~; w5 k %~nI - 仅将 %I 扩充到一个文件名
6 p% n/ a* U. R9 e# j r$ A+ n %~xI - 仅将 %I 扩充到一个文件扩展名
; p1 q- q* {% M6 g %~sI - 扩充的路径只含有短名/ K4 |$ n, Q2 K$ v" i( W9 K
%~aI - 将 %I 扩充到文件的文件属性
, N$ h+ u3 `& n6 V) ~: ^, u. T' ~ %~tI - 将 %I 扩充到文件的日期/时间
5 I; ]' ^( b3 Q! |) C7 Q4 F: S %~zI - 将 %I 扩充到文件的大小 c9 W2 Q4 J4 L" R+ u
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
: J* J3 \& N1 n( I/ Z% R1 V% Z 到找到的第一个完全合格的名称。如果环境变量名
: `. f! d& [* q, ~+ W0 P- ^" K3 Y 未被定义,或者没有找到文件,此组合键会扩充到9 u7 X K6 ^/ _, v
空字符串$ D2 e/ s* Z) s" O
6 X! F- `+ b# ~7 h可以组合修饰符来得到多重结果:! C( N' I. r1 J7 W, Q @; @
7 N. C+ T: V) Y! X9 W X3 R x
%~dpI - 仅将 %I 扩充到一个驱动器号和路径9 \4 S, Z. M4 J' S6 q. ?5 r& A
%~nxI - 仅将 %I 扩充到一个文件名和扩展名/ ?6 V5 K I1 |% D" Z0 K; ]# \# O
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名# v) A" C7 L' u
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充- i: G' P3 x1 D( u) d! Q& N0 a
到找到的第一个驱动器号和路径。 4 P9 i- L8 V' n
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
! L. ~ T2 W& ?, Q/ f; k8 t8 W
6 `9 X% z2 e) a6 ] Y: h. b! ]在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
9 o3 o6 Y1 u# D% C2 `' t用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
2 ]6 Y9 a# y' L% k. P% D比较易读,而且避免与不分大小写的组合键混淆。3 {% w) p( m! T0 g* P2 L4 b
* q. |: \ g2 e# T9 O7 H
+ P3 _, t8 d6 K! o
--------------------------------------- f. q7 h$ @5 O* ^
转自 http://www.cnblogs.com/tanzhiwei/
: M) q, T6 p5 y6 S7 a; x- s* t* ?
1 G4 G9 {" O! p( G7 @, X! |9 I% m[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|