|
|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用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
查看全部评分
-
|