|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决 I G; k: [+ U' b
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.* s3 Z2 f0 l6 F" T1 _3 R
DOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:6 R8 S* g+ }* b; b# W( Y/ [$ p$ r5 K
for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"$ a+ C% d3 ?# ^9 k# Q
这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.; n9 y- {' E: B# \: Y' M
* T; A1 g' u9 m, ^, \5 }
2 {' U8 c6 H! K$ `0 S, C7 \( U) B9 I5 g/ Z( D* [+ F6 u5 K* O/ ~/ d/ j( r
3 m$ G1 ?. Z) p7 A7 i
/ l3 G; L# L7 e) q, U3 q. }/ e( g" P% A M; D, _7 s
- c3 N0 l. {* b% a+ l% R$ v
对一组文件中的每一个文件执行某个特定命令。
1 u/ w2 C [& A
" }, O$ j6 O6 d: ]3 f' CFOR %variable IN (set) DO command [command-parameters]# j* G% N( @- w7 R( z
0 y$ Y; b z) ?. p
%variable 指定一个单一字母可替换的参数。0 J L: [$ k' r2 P2 _
(set) 指定一个或一组文件。可以使用通配符。
7 S# k; a5 s3 _3 v command 指定对每个文件执行的命令。$ E* m3 C3 a- |. w
command-parameters
( b6 y0 b" }) r: A1 Z 为特定命令指定参数或命令行开关。
1 ^# P9 x G) F- w2 f& \5 s& L. A6 d, P
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable 3 ~9 a$ {* E( a6 p$ y- S
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
5 F7 {! y" S( G1 S; E
$ Q/ g' I/ e0 w- q9 F, N# a如果命令扩展名被启用,下列额外的 FOR 命令格式会受到+ v/ g5 l9 z D4 c
支持:5 _$ z# W; W8 |
- g/ A; S/ Z- j8 K5 L8 |( c: `FOR /D %variable IN (set) DO command [command-parameters]
( u1 N9 w( b9 H: t, s/ H; ]# I: B8 M+ p; c' G
如果集中包含通配符,则指定与目录名匹配,而不与文件
% ~/ o7 j+ l3 k' Z7 g/ @ 名匹配。# G! w- p) w) v+ G# p
+ c2 n/ Q7 `( W2 O' `9 l
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
- {2 F2 @/ P; O
& M9 z$ h6 r' C/ W; k 检查以 [drive:]path 为根的目录树,指向每个目录中的2 z p1 _! @$ R9 C w8 N* v
FOR 语句。如果在 /R 后没有指定目录,则使用当前6 |+ \0 G; p Y! l3 y9 G; n$ w
目录。如果集仅为一个单点(.)字符,则枚举该目录树。
1 V R& Y4 T8 m( ]2 s5 y
2 ^2 c, O0 V( n4 A( cFOR /L %variable IN (start,step,end) DO command [command-parameters]
! h7 h/ L8 a* m1 s, [
0 |8 I6 G7 ~/ u 该集表示以增量形式从开始到结束的一个数字序列。; f$ L/ K: |5 m' G
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生( W) S+ ~% Q; r: J M |2 x
序列 (5 4 3 2 1)。
/ f. R/ s" f/ V: `- M. B' v# M" |; H% j$ c. `7 @
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]3 }( |3 y* ]: T+ ?2 `1 e/ A2 P
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
9 A3 O" u. |& BFOR /F ["options"] %variable IN ('command') DO command [command-parameters]
! D: N/ l. X- N3 ]$ M3 u R0 d7 e% z0 z( c8 Q9 d2 B! Z6 L
或者,如果有 usebackq 选项: N* R6 s/ H Q7 W0 s6 T) ]
* s' ?% s6 C) j2 q; y" L
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]8 c) d( Q! {* ^% u! C `3 s9 d
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]" Z1 ]% u+ k! B ^" z a
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
4 D2 j' Q( g# |# z! J _/ h- X7 M1 [0 I$ f; i
filenameset 为一个或多个文件名。继续到 filenameset 中的# k% z- ?" {) T ^
下一个文件之前,每份文件都已被打开、读取并经过处理。
& M) N Z! @4 q9 K! b 处理包括读取文件,将其分成一行行的文字,然后将每行# z0 X! y4 W; k
解析成零或更多的符号。然后用已找到的符号字符串变量值0 u6 o8 P- H7 b" Q
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开- Q, M" D" c2 p" t
的第一个空白符号。跳过空白行。您可通过指定可选 "options"
7 _/ U/ a/ |7 |1 ]7 }* N 参数替代默认解析操作。这个带引号的字符串包括一个或多个' i, y/ q% `) z7 u* A# H& t G* Z C
指定不同解析选项的关键字。这些关键字为:3 [6 U( }/ y+ {- [% S
* ~: Y! a3 A9 O+ W7 d eol=c - 指一个行注释字符的结尾(就一个)
/ f' R% A5 P$ Y% b$ @7 ~7 { skip=n - 指在文件开始时忽略的行数。
) ^9 g4 W8 f( o8 s* J) Z0 M: u delims=xxx - 指分隔符集。这个替换了空格和跳格键的 A, k; h- i$ [/ i8 v
默认分隔符集。2 d/ [8 b; n& D$ j1 g2 C" i" X1 a
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
/ J! H* K( D/ R* f. P 的 for 本身。这会导致额外变量名称的分配。m-n
6 k1 ^" L- A) F' X1 S( Z( a 格式为一个范围。通过 nth 符号指定 mth。如果
' v, @" M: c& z 符号字符串中的最后一个字符星号,- R4 D- o- t8 D, A( f4 G* L
那么额外的变量将在最后一个符号解析之后" C, f+ o/ T, \% Z0 T) D
分配并接受行的保留文本。
" h5 `+ R, `5 p4 H usebackq - 指定新语法已在下类情况中使用:
$ Z2 c: ~) c6 G% L: O1 j3 S7 { 在作为命令执行一个后引号的字符串并且一个单& t% V E! S- ]. t
引号字符为文字字符串命令并允许在 filenameset
2 T, l: v$ ~* f: Z2 R 中使用双引号扩起文件名称。5 D8 n% L! l5 e# P; {9 s* p
+ b9 o7 e8 w" K0 I 某些范例可能有助:6 k/ ~: s- _. |; g) E/ Y1 u8 |
" ]( v9 @. G* p$ `1 z, C7 zFOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
8 u& m* v5 |. e& [ t$ m4 i2 t& p
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
. y f2 Q/ P2 h8 }6 k 每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或2 d: S: n; Y1 q7 r6 F1 A" O
空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
1 n8 c8 G3 @+ j4 z 取得第二个符号,引用 %j 来取得第三个符号,引用 %k
& [1 w8 C2 }1 j. ~ 来取得第三个符号后的所有剩余符号。对于带有空格的文件5 _7 D7 u( p3 R; I. X) C9 }: i& v
名,您需要用双引号将文件名括起来。为了用这种方式来使
7 M( P6 U2 ? s; v, k8 m 用双引号,您还需要使用 usebackq 选项,否则,双引号会5 s, G6 z' Y: A v3 [8 G
被理解成是用作定义某个要分析的字符串的。$ }% d7 x: |# U
$ f1 n% r( `- R$ i; t- G- L7 i
%i 专门在 for 语句中得到说明,%j 和 %k 是通过
3 T: Y: |1 v8 h. I$ R" j8 S tokens= 选项专门得到说明的。您可以通过 tokens= 一行
! u- n& k: x3 ?! I1 l- ]' W 指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
" d+ ]7 a- E" ~( g% [ 'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,7 u( W. \+ E7 ~5 ]& ^" [
同时不能有 52 个以上都在使用中。
; b8 |+ b2 ?) _: W% K! e8 ^% R% \
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
}: c0 `6 l/ W 用单引号将括号之间的 filenameset 括起来。这样,该字符
2 s3 T6 Y$ m+ o% X x) Z7 k 串会被当作一个文件中的一个单一输入行。
& w- _# B3 M; }" C2 k; S! K! E% C# U+ X2 F, t# Q [
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将3 k( S. G6 Z) B. V
括号之间的 filenameset 变成一个反括字符串。该字符串会* L( M' }# f% u9 f
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进2 k! A5 v# D: C$ g4 E1 U, \
内存,并被当作文件分析。因此,以下例子:
, W; A a7 k4 Z) S' H. M/ E. O6 a' T7 x: s
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
* P+ q' \; p E4 }/ I; |# N2 @% x' j+ N
会枚举当前环境中的环境变量名称。
- t7 v" t9 G9 N8 u3 q( B7 |& ~9 b$ B# Q$ _
另外,FOR 变量参照的替换已被增强。您现在可以使用下列
# _0 n- W) o' O选项语法:' R1 b9 ?# I, G3 }9 {4 K
* z5 }, B- l I' k: F9 G: O4 e1 i ~I - 删除任何引号("),扩充 %I9 J4 Y. l$ K4 V2 v; F+ w" Z/ S
%~fI - 将 %I 扩充到一个完全合格的路径名9 z3 V5 `' c }+ Z7 ? _$ c: m
%~dI - 仅将 %I 扩充到一个驱动器号
1 F* u! H* a$ T/ F6 _, c %~pI - 仅将 %I 扩充到一个路径
0 n' Q( K5 y( |- Z& M! c %~nI - 仅将 %I 扩充到一个文件名
2 o: ^. I: s8 Z% t1 L %~xI - 仅将 %I 扩充到一个文件扩展名
) j+ P9 T! n' O5 X. f* } %~sI - 扩充的路径只含有短名' |6 I4 y/ N6 y, P3 Q
%~aI - 将 %I 扩充到文件的文件属性4 K0 j9 ^: x4 O
%~tI - 将 %I 扩充到文件的日期/时间$ a, w- B5 n5 K. _/ H
%~zI - 将 %I 扩充到文件的大小
" I3 \! _7 m9 \ %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
& g1 o) u9 z- e 到找到的第一个完全合格的名称。如果环境变量名
* Q+ d! j. H3 c* x! e 未被定义,或者没有找到文件,此组合键会扩充到, j5 ]! |1 r- x/ `6 b$ z
空字符串 `1 w0 o% H! A
9 S7 \, A2 r0 y5 I5 `可以组合修饰符来得到多重结果:$ z. q+ p9 g- A! v, L
$ H" {) ?1 f \ %~dpI - 仅将 %I 扩充到一个驱动器号和路径
/ x& s" d6 A3 g N7 U* q; \$ | %~nxI - 仅将 %I 扩充到一个文件名和扩展名
& V5 X" K; _1 o; @# h9 v+ e! ^ %~fsI - 仅将 %I 扩充到一个带有短名的完整路径名2 M0 K9 p" n: o2 n* M5 ^
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充/ t; B# V& b3 n. r
到找到的第一个驱动器号和路径。
% C, J) ^# L4 c. f# P% h %~ftzaI - 将 %I 扩充到类似输出线路的 DIR( O1 _# I5 l5 P! S# [3 [0 w
7 ]' |. T' y/ j2 B" w
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法; l- K2 y4 @# u
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
0 S8 p0 _: e3 Q$ ~+ a比较易读,而且避免与不分大小写的组合键混淆。0 N0 N6 I1 q. w/ i- u& s( X2 h
4 e; K2 W0 U3 l5 d& C" a
4 s3 }! H) C O6 Y$ I# i$ B---------------------------------------/ s j; w* e' D' g! Y4 {" X
转自 http://www.cnblogs.com/tanzhiwei/
Q5 d6 B7 @3 b# ?
/ C# i O4 f8 A. ?2 a: c[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|