|
|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决2 Q& X" X; D$ a4 q$ j6 P* w
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.
$ Y& r* F! E2 Y+ F* {6 A% _4 dDOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:6 G& N5 g# `7 l
for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
2 L1 A: z( @2 D( y" S; @0 k, R这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.
. d- C. p$ r I
; x! t' F! n6 ?' y* C; R5 D8 H
- N. J1 z+ O# z5 k0 I6 M" l+ r+ k( D, q8 O
6 W9 \4 f. C6 F* f3 X
2 m+ E8 |; |9 h" w" q) z& g
) c* |2 ~/ N: t9 E/ [, p6 q7 n
# D3 g7 o0 G- f& n6 u9 Z对一组文件中的每一个文件执行某个特定命令。
' H8 M! D& t0 i6 Q) w& ]
# [% F) ]9 _( q9 yFOR %variable IN (set) DO command [command-parameters]
; K7 N8 u& g# b
: M$ P6 Q; q, ^$ G. m$ u: ] %variable 指定一个单一字母可替换的参数。
! _4 h- z6 I" B9 g7 ? (set) 指定一个或一组文件。可以使用通配符。
% Y: l k2 z/ u+ @% ? command 指定对每个文件执行的命令。
1 o* E/ O# R; p command-parameters( y6 n! L6 u i; n& J2 V5 L% e
为特定命令指定参数或命令行开关。; |1 M' l! `& K
% U' u+ @4 c, f* j" h" t# w7 f2 j在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
- E5 y, D1 z; e- A6 P6 _而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
5 c6 d+ N/ f4 W0 |" x0 r4 Y" m* E4 H1 ?
. W4 i# U1 ]* m+ S; O如果命令扩展名被启用,下列额外的 FOR 命令格式会受到5 I, F1 P7 ^' B
支持:; U `& A% Z2 L- y7 {; \
7 n" |, ~- e0 W* u7 |4 ] ^
FOR /D %variable IN (set) DO command [command-parameters]8 m5 J" \; S E6 }7 Z1 ?) k3 c1 F
# X& C1 d# b. I7 C
如果集中包含通配符,则指定与目录名匹配,而不与文件, g7 [( V8 x" i2 g3 Y* \" `, \/ G
名匹配。7 T8 T: T4 h$ l% s
1 C; \, C" F2 \2 a7 h7 ZFOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
' k6 }$ h3 G9 F7 H; J4 g% D+ v c
; A* M8 F4 | _7 q5 ~5 H9 B5 { 检查以 [drive:]path 为根的目录树,指向每个目录中的# j/ ]- `1 U0 q2 E c" E- q
FOR 语句。如果在 /R 后没有指定目录,则使用当前
+ [, N1 D1 m( k1 U9 ~. \ 目录。如果集仅为一个单点(.)字符,则枚举该目录树。
0 p9 N, B1 S; O" s, q/ K4 N1 N! E
2 _ c, T) H8 {" a% P2 B( n$ gFOR /L %variable IN (start,step,end) DO command [command-parameters]
$ \& \/ h! x) m3 y5 ]% q# d! r' s9 e( d2 I
该集表示以增量形式从开始到结束的一个数字序列。
1 ]7 C8 H7 D5 J 因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生# B0 T: ?3 Q" ^9 ~5 W5 e7 ?7 ~
序列 (5 4 3 2 1)。
5 `2 P* D/ }: y4 F$ V8 I5 ?/ N
- m1 u% E" Z, G1 d, PFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
3 U- M% ]+ E1 O' t- u% R; EFOR /F ["options"] %variable IN ("string") DO command [command-parameters]
! S% s$ S* S% u, u. |/ ?" W) EFOR /F ["options"] %variable IN ('command') DO command [command-parameters]2 J/ g( t- U, _' y. E5 l* g5 d
- D6 \! H* i5 B" W; R% D# ^7 y
或者,如果有 usebackq 选项:- c2 [. c) K! T- W
: c- B7 g: G1 HFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
+ ^% ]) V0 G8 j+ ^6 E$ C9 H! RFOR /F ["options"] %variable IN ("string") DO command [command-parameters]
m. j6 M0 A F- KFOR /F ["options"] %variable IN ('command') DO command [command-parameters]
" ~/ U( Y. u$ `/ r# {6 z* ~2 |
/ U( d |+ w5 b4 d+ B: ^6 ?5 n filenameset 为一个或多个文件名。继续到 filenameset 中的
7 h1 \* t% Z2 q9 u8 I, \' Y; a 下一个文件之前,每份文件都已被打开、读取并经过处理。
- J) D7 g/ d9 j6 c g' m 处理包括读取文件,将其分成一行行的文字,然后将每行
$ n" s' S q% L& r" B 解析成零或更多的符号。然后用已找到的符号字符串变量值
0 `$ a* L. l& k- e* @ 调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开! x" }/ f6 U3 Q* ` G1 W7 Z
的第一个空白符号。跳过空白行。您可通过指定可选 "options" % ~; c- D9 b4 f2 y; x
参数替代默认解析操作。这个带引号的字符串包括一个或多个
8 [, m( ^: K8 ]$ d8 T; y- K 指定不同解析选项的关键字。这些关键字为:
p6 T1 F% Z$ n0 k% {' r3 N; U0 {! w+ g F' |( E* I
eol=c - 指一个行注释字符的结尾(就一个)' a5 K8 i. Y" Z6 L, B
skip=n - 指在文件开始时忽略的行数。8 g) J @ N( t3 ^5 b3 H
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
) l9 Q1 ]- b$ V" u7 C! u 默认分隔符集。
: }/ R7 e4 o( I/ G. \; D( O tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
. _: o* I/ O1 a! r- A) v. }* w 的 for 本身。这会导致额外变量名称的分配。m-n$ _& h' `' C/ A, r, t
格式为一个范围。通过 nth 符号指定 mth。如果+ i/ R* `3 Z8 w) e6 W5 {3 r
符号字符串中的最后一个字符星号,
2 W: }2 J, R- R& R 那么额外的变量将在最后一个符号解析之后& _ N' R3 b& {- I& \2 H# z' }
分配并接受行的保留文本。- r) p \9 n/ z3 F* Y
usebackq - 指定新语法已在下类情况中使用:
1 y _' a- R) M! {9 l) c 在作为命令执行一个后引号的字符串并且一个单7 N4 Z3 y) z# G: L
引号字符为文字字符串命令并允许在 filenameset0 f W2 l: q' v* Y
中使用双引号扩起文件名称。
3 Q2 g6 t' J* w) J3 E- D3 G8 _
7 R$ x3 m1 p K$ n 某些范例可能有助:8 V3 `! M# P; I V/ r% D2 x
! _" B) c9 o6 c3 \
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k* R) B+ L) H) n7 b6 Q
8 i# G3 O& Y: `3 b( p
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将6 F0 F5 l& Z% I* E1 x. t+ E8 W8 c
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
: `& _( f+ F( V5 {9 T 空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
7 g1 }& v3 `: H 取得第二个符号,引用 %j 来取得第三个符号,引用 %k p& m" E+ h7 _1 F3 f# Q
来取得第三个符号后的所有剩余符号。对于带有空格的文件
7 u' b; z. l) n+ E" n 名,您需要用双引号将文件名括起来。为了用这种方式来使
3 `) A7 Z. u) G8 U, H' B: k 用双引号,您还需要使用 usebackq 选项,否则,双引号会
" b9 n; {& r1 P* @1 V6 [ 被理解成是用作定义某个要分析的字符串的。! a, Y5 L3 b8 t6 R5 r
; z' ]+ G* S2 L
%i 专门在 for 语句中得到说明,%j 和 %k 是通过
$ C( n9 U* [* m# } tokens= 选项专门得到说明的。您可以通过 tokens= 一行
6 E' V8 J+ |/ K! r8 V9 ?. R: c 指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
1 |- O5 z- Q! c4 ?. l 'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
6 n! V% M7 D5 ?) D 同时不能有 52 个以上都在使用中。9 A& J9 F) p# x5 R: }) F1 [+ ^! s
& a; q6 {4 |5 q! P" L; p
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
* |& L0 M6 H% V2 L3 Y 用单引号将括号之间的 filenameset 括起来。这样,该字符. z/ u( H; ~" Q1 X
串会被当作一个文件中的一个单一输入行。
* \+ i. q* K( Q$ i! s1 Y6 I- [( O9 H0 X' e
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将5 W3 a/ P- \ X9 Y- Y4 e1 c+ [
括号之间的 filenameset 变成一个反括字符串。该字符串会
- i& j' C' i9 \( E" U 被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
% A" D) F+ K- H R _ 内存,并被当作文件分析。因此,以下例子:7 K; ]1 ^/ }, g8 K* j2 `( E! V
9 R$ M8 E) K `* E( I
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
0 c+ ?/ h5 H. T8 |; V+ U
8 Q5 d% Q9 r; o' g7 ^5 `' m 会枚举当前环境中的环境变量名称。
0 C! p# s( U" j9 k" ^
! I9 t- D, V0 b另外,FOR 变量参照的替换已被增强。您现在可以使用下列
1 V1 m% ^$ f$ m: `+ R/ f选项语法:" u5 X/ G! f3 ^( Q) T
- V" ~5 F" [5 Q& g. O
~I - 删除任何引号("),扩充 %I" N) T7 d# D# I* M
%~fI - 将 %I 扩充到一个完全合格的路径名' |# o" @7 k# b# ~8 p
%~dI - 仅将 %I 扩充到一个驱动器号3 t8 k: W, S/ J8 k
%~pI - 仅将 %I 扩充到一个路径
1 [+ ]+ l" p z" p4 q$ d %~nI - 仅将 %I 扩充到一个文件名
7 k9 W/ Y* c6 X% s %~xI - 仅将 %I 扩充到一个文件扩展名* X5 g5 g; }& o0 j# w" o5 `
%~sI - 扩充的路径只含有短名
, h3 s& E! Y p %~aI - 将 %I 扩充到文件的文件属性& q5 _% a. k6 P: }$ D" X
%~tI - 将 %I 扩充到文件的日期/时间& X/ V3 n" c' ^( [( d' q
%~zI - 将 %I 扩充到文件的大小. V8 }9 o! [' u- J# E( c% R: k
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
$ v: `- V# ]5 m' K7 [/ R 到找到的第一个完全合格的名称。如果环境变量名
# }# S) H) u' q# [# w 未被定义,或者没有找到文件,此组合键会扩充到! Y9 f$ ^) X0 N( Y2 E; h6 k
空字符串
0 m& Z% F! {/ I& B
( U# C- U& \2 W! ]$ x% n* c可以组合修饰符来得到多重结果:8 [, c) e4 V6 @8 a* |: Z
2 L: ^9 w# R- l" A' y* U %~dpI - 仅将 %I 扩充到一个驱动器号和路径
. l+ U) H5 ?9 n; H& B %~nxI - 仅将 %I 扩充到一个文件名和扩展名( b" e* A% ~% r1 P4 m! K
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
; j# u$ l- C8 m %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充( E7 w/ c' R9 v; y# Z {. F3 b
到找到的第一个驱动器号和路径。 & }9 T% G6 c* p) T
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
! F% p# a5 @( h6 b- B9 d2 P( m X+ U2 h
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
+ q1 Z# K) e; @3 w' U用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名3 H! g; e! J: o" c6 A4 N
比较易读,而且避免与不分大小写的组合键混淆。: Z& D' D1 m" K7 {# w4 j
, L* i' V; _: W( I* L4 P7 S
8 A8 `- A: U7 F$ P+ N
---------------------------------------' Q" Q. y) R. y8 K
转自 http://www.cnblogs.com/tanzhiwei/# t3 W2 U' X9 T J0 B* O
& g3 h+ G$ N7 i$ \/ U
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|