|
|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决2 \+ [% G1 ]2 k* b, a: b
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.- ?2 j5 Z9 |& t* p" {0 s) p
DOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:
' [3 {3 U" a3 K& ` Q/ i, e/ Dfor /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
# j+ D4 {7 U$ g' X这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.
! o f1 L1 N. ?! ]) a" Q5 x
2 }6 F X+ Y Y4 A7 J1 C& B- f$ b5 n! k
- o$ z* Q& |" |- k4 g3 I
+ _: `" a) u# z9 X1 ~& r- C8 @/ a' A
, n, E) O" v8 Y
! w* \# L" E8 `7 r& k对一组文件中的每一个文件执行某个特定命令。 I3 @) H" B/ }: X
% N' Z$ l g( {0 Y! KFOR %variable IN (set) DO command [command-parameters]5 `" S9 p2 G; S) f
1 n) h: R% R ]4 h0 C
%variable 指定一个单一字母可替换的参数。
% \7 N$ L! X ? (set) 指定一个或一组文件。可以使用通配符。9 V9 q+ b4 `3 K6 x
command 指定对每个文件执行的命令。
3 T* B: O8 P. B* d7 U" S command-parameters) M) a$ R" v2 M, q7 L% W4 N
为特定命令指定参数或命令行开关。
& P' W M& L8 n9 e' @& [8 x9 f7 }! B0 q1 J7 R3 b
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
/ P4 \& Z. E. v8 z' d而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
; N4 y( E0 Z9 n N# p2 H7 h, ^* O6 ]- P/ B+ A3 T
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
4 Y3 z4 ?1 h3 C( @7 e& p支持:5 r# n# O! k1 p, q1 z# G
( E \* a& Y" X" U
FOR /D %variable IN (set) DO command [command-parameters]
$ v# L7 j- B5 K2 Y, Z. f N( y2 z$ l1 v( |9 h% g! A3 \ \; \
如果集中包含通配符,则指定与目录名匹配,而不与文件
, `; Z! y$ x# B5 \/ \* A 名匹配。
; v7 {# a$ e* l. w1 V7 ?3 _ L m7 y+ J8 J+ P) l$ s
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
! S+ j% y! m0 D3 G- C7 b1 p8 @: }& ?* x" u1 W$ d: P
检查以 [drive:]path 为根的目录树,指向每个目录中的: u* J: o# V% M, e
FOR 语句。如果在 /R 后没有指定目录,则使用当前
; d: y8 N8 Y# i \8 B9 d0 D 目录。如果集仅为一个单点(.)字符,则枚举该目录树。! b, c* E- L1 Z% x
; f2 q5 x% g% a4 \/ b0 Q, O
FOR /L %variable IN (start,step,end) DO command [command-parameters]+ b& v& A8 a1 X" E7 t& S# ~
- l, T0 H: A6 r; Y* O% Y) f
该集表示以增量形式从开始到结束的一个数字序列。6 |! F+ X7 `) N2 K% ^4 i9 n4 i
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
! y8 x% R% ?2 P$ K4 B U- g4 a 序列 (5 4 3 2 1)。2 T! x6 j' b. T* b
% P* M& U- r/ |) u8 K+ w/ T NFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]- ?- @# p1 }( P( w% S; H9 K
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
q5 N/ n, z5 o4 u) V2 ^& X- h' sFOR /F ["options"] %variable IN ('command') DO command [command-parameters]3 Q. W! t4 V, _+ G
' H6 k8 X2 \+ x1 k 或者,如果有 usebackq 选项:
" o* m% r: @+ ~8 S4 K' S B% S1 X; [# F4 O) ~
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
! o# i6 ?0 S3 W3 e+ R: pFOR /F ["options"] %variable IN ("string") DO command [command-parameters]
- L f0 X! {) ^4 JFOR /F ["options"] %variable IN ('command') DO command [command-parameters]' O; h/ Y1 F2 y8 O5 N9 H
# G9 c8 z5 z- u5 K4 v
filenameset 为一个或多个文件名。继续到 filenameset 中的, ^' b6 }( k, c* g) {! k& c) B) }1 Z
下一个文件之前,每份文件都已被打开、读取并经过处理。9 l( d0 j3 K6 v3 B& @% L4 F
处理包括读取文件,将其分成一行行的文字,然后将每行$ }7 y n! Y1 P3 v% g4 b
解析成零或更多的符号。然后用已找到的符号字符串变量值
3 {! p" X I" T* `, u( V- R8 { 调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
1 w2 r) K; O* [* i2 J; M 的第一个空白符号。跳过空白行。您可通过指定可选 "options"
4 {9 Q3 v( z# e, s+ j8 g 参数替代默认解析操作。这个带引号的字符串包括一个或多个
( H8 s6 f3 u" E3 b# ?. D" F; T 指定不同解析选项的关键字。这些关键字为:
$ h! @: h* p! y; s& c2 H' M; i( |9 o( ?. L: |+ w) ^. {
eol=c - 指一个行注释字符的结尾(就一个)
/ P5 M y& E1 m skip=n - 指在文件开始时忽略的行数。
E2 q/ q9 E" Q3 v delims=xxx - 指分隔符集。这个替换了空格和跳格键的: n8 v+ a7 c& z$ A
默认分隔符集。
! D6 X3 ^' M. n4 S: } tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
7 U9 w5 q. k# O" D) p8 Z! h 的 for 本身。这会导致额外变量名称的分配。m-n
. e3 O+ [) p! n; e0 v. A' q" x 格式为一个范围。通过 nth 符号指定 mth。如果
8 V% Y4 W& J4 O+ ?: G 符号字符串中的最后一个字符星号,! L! a& r) [' K* z! N( h
那么额外的变量将在最后一个符号解析之后6 y6 m) B3 U0 Z; n% J* e6 U
分配并接受行的保留文本。. k2 o# S: |$ f$ z
usebackq - 指定新语法已在下类情况中使用:
/ ^+ v3 B4 t7 u. S6 q" ^" f 在作为命令执行一个后引号的字符串并且一个单
. a* b+ g2 I S) ~) F7 m 引号字符为文字字符串命令并允许在 filenameset: z6 y1 \/ h# L! k) m9 k7 ]
中使用双引号扩起文件名称。% }( e }' c" b. A7 n
6 G: t3 P. U$ `7 H
某些范例可能有助:/ d |0 E( s: r0 H1 }/ t
; q7 }* p: Q" f* S
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k! [7 s) X9 v" f" m2 }: E# s; e
& [& C7 c2 P E. R6 m1 v( o+ H 会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将! A& r) \9 s# H h4 d- ]2 F8 R
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
, u/ W5 W5 Y3 Y7 z- j" I 空格定界符号。请注意,这个 for 程序体的语句引用 %i 来 Q* H- j8 H0 Q L& o/ U
取得第二个符号,引用 %j 来取得第三个符号,引用 %k, C5 [0 g; w, i% I) D3 ~ i. ?$ p
来取得第三个符号后的所有剩余符号。对于带有空格的文件( l/ ]$ [1 h# [3 S
名,您需要用双引号将文件名括起来。为了用这种方式来使
. v! U/ u1 @0 k( R 用双引号,您还需要使用 usebackq 选项,否则,双引号会
. @6 C5 \; Z& W 被理解成是用作定义某个要分析的字符串的。3 `0 x% n5 {! y1 r: Z
% l4 x9 ?. C# H$ J) r# @! k: y# e %i 专门在 for 语句中得到说明,%j 和 %k 是通过 a5 D3 k# Q8 z
tokens= 选项专门得到说明的。您可以通过 tokens= 一行
+ R4 ~; w* {' \1 B! w" b 指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或7 [* v3 u; F# A* X
'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
9 q& {9 q* z9 v# h# n+ } 同时不能有 52 个以上都在使用中。
L6 X3 U) D- N- f% |4 z8 C6 y$ p8 j. N; l8 N
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
% S, s2 q. Y% S% J 用单引号将括号之间的 filenameset 括起来。这样,该字符- a# }, ]0 @- A6 V3 q2 H H9 i
串会被当作一个文件中的一个单一输入行。
L' A: {5 E6 @5 |* N; F/ s0 i A9 Q9 u4 L9 {0 L
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
$ J u. k5 ~% t 括号之间的 filenameset 变成一个反括字符串。该字符串会) g; Z) k' @8 d& P
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
# l! [4 D- _( O. E: S! Z 内存,并被当作文件分析。因此,以下例子:8 {- \. ], d% g* c' C. f7 c
0 h1 m4 D# l6 B. _9 p* n6 Y) y% ] FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
+ e: l0 e0 X) v5 b" b- U! h8 S' v* A# G* z8 o: P, p
会枚举当前环境中的环境变量名称。
) @( W6 {5 L6 s2 t# x
+ e; v3 t- p4 C3 C/ |另外,FOR 变量参照的替换已被增强。您现在可以使用下列" w6 i8 x- A3 t( U0 [
选项语法:9 k4 c1 r) l" J; q: o' `
+ F" o% G3 L/ e/ k2 @' S8 R ~I - 删除任何引号("),扩充 %I1 A1 a# p) z7 \. q% g
%~fI - 将 %I 扩充到一个完全合格的路径名
/ m. E: R! Q: W/ q8 ~" E! K3 t %~dI - 仅将 %I 扩充到一个驱动器号 n$ [) C/ @8 k
%~pI - 仅将 %I 扩充到一个路径 \ x9 ?4 l5 U; P, v
%~nI - 仅将 %I 扩充到一个文件名
8 ?/ X6 |) i: P %~xI - 仅将 %I 扩充到一个文件扩展名
! [1 P2 g7 j5 y %~sI - 扩充的路径只含有短名2 T6 ^ F" X) w, w9 l. p/ J
%~aI - 将 %I 扩充到文件的文件属性0 m; D4 N1 W# C
%~tI - 将 %I 扩充到文件的日期/时间( I$ o* `& g: D; z' \
%~zI - 将 %I 扩充到文件的大小
2 q1 x ?. e, D6 }+ k %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充9 f: f- y0 P- s. p9 c) ~/ P0 n9 z
到找到的第一个完全合格的名称。如果环境变量名
3 I7 U2 x- ]) a$ p1 f 未被定义,或者没有找到文件,此组合键会扩充到
3 O6 d4 M* K3 \( B+ Q 空字符串
! W2 F' a. q, ]3 Q2 H- m4 R0 j2 t* |8 k: {; @+ A- P+ w
可以组合修饰符来得到多重结果:
! p' D8 g" w& T) h) p' o
6 b `# {3 \8 m) S1 ]8 L3 l* Q8 j %~dpI - 仅将 %I 扩充到一个驱动器号和路径( h3 K, x/ Y8 e- f- t
%~nxI - 仅将 %I 扩充到一个文件名和扩展名" D, y/ I' f, f6 ]3 J4 E- Q
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名0 m3 n) m2 Y7 n6 J; z7 b, f# I
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充; q& i$ R; n$ l& G7 T
到找到的第一个驱动器号和路径。 : l: [9 V7 \$ H3 D" ^2 Y% o
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR3 J& x' u' B1 h3 b
+ ~- _: z, m/ o6 [5 z) B9 h
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法 q. s" V* o! `0 @; `
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
2 m( \2 C% q0 P+ M比较易读,而且避免与不分大小写的组合键混淆。
8 P4 P C/ f% C$ V/ ^5 p1 H2 o6 h
5 x- N, [$ k4 Q& E: ]8 V
" u- d% F, N1 S3 q/ R! t% y---------------------------------------
& ?+ _* b9 K+ l- X6 G转自 http://www.cnblogs.com/tanzhiwei/, P/ v! I1 W3 z# s2 r
6 a2 o) Y: a, z
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|