|
|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决" m" g' ?2 X/ }4 E7 f5 e# i: \; T
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.
+ |( u6 B! Z2 t& M; XDOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:+ @. t3 {3 i% r! m
for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
( m$ Z' m9 u5 t. \: n1 m8 E O( b这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.; @2 l0 K; S$ w E( H' h7 a! W' O& l1 j
2 O" ?% F4 H- p Q7 Y
: }1 d4 `, y0 M
3 Z9 t( E" K7 W0 s
/ a' J8 n9 C/ B) R9 ]5 F3 `2 l9 C& o
2 x0 j! l6 s- A8 s N- G( ?
+ O. O$ R9 W' e* j D& F- E6 s( \, |" q' ]! n- S
对一组文件中的每一个文件执行某个特定命令。# r _% j5 G* K3 @1 d
. Z3 W# x, _6 K& U3 p' y# {( F
FOR %variable IN (set) DO command [command-parameters]( [0 U1 L% H0 s8 j3 g' Q D/ X
0 E7 W1 @, A. b" T+ y5 g2 J
%variable 指定一个单一字母可替换的参数。- X& E) k7 ?. |, [' Y" Y. v$ g2 ?) b
(set) 指定一个或一组文件。可以使用通配符。
- h4 }2 s) F: y: x command 指定对每个文件执行的命令。
& H) l& A' F6 T. r& i; Y9 ^ command-parameters
; \2 f5 H5 X j, Z' p/ B 为特定命令指定参数或命令行开关。
9 `4 ^6 _% p8 c1 V) {+ g' J+ Z9 X! Q+ d# }" O: S t
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
" ]6 w; k: b3 t1 d# @3 E而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I./ n) G8 L( r1 f" j8 U
; |9 G- {( Q: ~- u& s
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到 b; h: P8 q. o/ e6 o A A
支持:* z( {) M, p: }+ @
- U* ^2 Q; Z6 J6 Y$ rFOR /D %variable IN (set) DO command [command-parameters]& n) K3 r9 W! g) A" _
( \6 H3 R- s% ] H6 J+ y9 ~" ` 如果集中包含通配符,则指定与目录名匹配,而不与文件7 s: ~! b8 q% V$ K) c- Y4 f. I
名匹配。; ^/ S1 D1 H5 J* G J! f+ H# W8 B0 y
( P' q8 Z' l' J2 fFOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
8 Z! {" j% ?2 y( c' x8 u5 ]5 N' X: N0 ?
检查以 [drive:]path 为根的目录树,指向每个目录中的% m) P: g8 `- ~
FOR 语句。如果在 /R 后没有指定目录,则使用当前
5 e" `5 ~4 u' T+ a; e4 E 目录。如果集仅为一个单点(.)字符,则枚举该目录树。% \9 t+ z3 u1 @% ~+ ]' B! w
6 _3 b1 p! {5 C g% J$ g/ p# o- ?7 l
FOR /L %variable IN (start,step,end) DO command [command-parameters] |! G- @/ s. k# U$ P: P
" }3 H. f8 v; \0 X8 T
该集表示以增量形式从开始到结束的一个数字序列。7 v( u/ M# M$ v. m. f# J
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生. |/ ?& f8 O& }9 Z0 x# I7 `
序列 (5 4 3 2 1)。- O8 p( \' G/ w+ h
0 w; m/ t: p9 n, w
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]6 [2 I+ [7 [5 x* Q
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
, @. }& ?9 I- D/ ~6 }; S) SFOR /F ["options"] %variable IN ('command') DO command [command-parameters]
0 G2 ^8 W4 r; J, O T' k; `4 v. H
( u: F& Z% v# t! q4 } 或者,如果有 usebackq 选项:
( U8 `" ^1 J; ]/ i
$ @) W, J$ h/ u8 ^$ uFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]4 v) {$ z* @/ _! q( c- I
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
* [8 q: D1 t- }FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
8 \3 \6 p V. `9 J+ y* E4 q! q3 O( a* y4 w+ @/ Q4 N
filenameset 为一个或多个文件名。继续到 filenameset 中的! |; p/ D. ~4 O# ]- T
下一个文件之前,每份文件都已被打开、读取并经过处理。1 F# k' d: h0 o! k5 u
处理包括读取文件,将其分成一行行的文字,然后将每行, y( e5 {* |4 s# A1 s9 Z" g
解析成零或更多的符号。然后用已找到的符号字符串变量值5 L( g* H) T- L2 N9 x c
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
4 D. F( I% r8 _) M1 z" Q. Q 的第一个空白符号。跳过空白行。您可通过指定可选 "options"
* E l6 A+ @9 @! H, q1 [& r 参数替代默认解析操作。这个带引号的字符串包括一个或多个
7 F/ x' Q3 {* t1 N3 ~$ o 指定不同解析选项的关键字。这些关键字为:$ l! W* Q2 D& j( ?
0 @6 V7 k J2 \6 f
eol=c - 指一个行注释字符的结尾(就一个), i7 t+ e a5 d7 V, A
skip=n - 指在文件开始时忽略的行数。
& N0 Z, [7 `2 v6 l) O delims=xxx - 指分隔符集。这个替换了空格和跳格键的
) Y9 P v* n' L P0 i 默认分隔符集。4 z% C5 g$ a( w% r$ Y& b
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代( T5 l7 @5 Y7 E) }
的 for 本身。这会导致额外变量名称的分配。m-n- E" T9 ? s: x" u. r( F
格式为一个范围。通过 nth 符号指定 mth。如果9 _7 [, K1 ^# @: B. F2 `
符号字符串中的最后一个字符星号,
i2 f8 u9 l7 c$ J, J 那么额外的变量将在最后一个符号解析之后
! K3 O$ O% w; V7 T( ? 分配并接受行的保留文本。3 r6 F8 H& F9 K6 k. \
usebackq - 指定新语法已在下类情况中使用: ; L3 x. |0 d8 t" s3 ]
在作为命令执行一个后引号的字符串并且一个单
2 B0 I5 ]1 }* \# _ 引号字符为文字字符串命令并允许在 filenameset
: q, ?: F& ?/ {8 u* P( ]! l 中使用双引号扩起文件名称。
6 ?5 T' b! B4 F P- G/ b( s% _3 c
) i6 L. G% U2 C- Z$ E* v 某些范例可能有助:
6 b: I' G- m) U- I8 p1 D: |# R( Z! j- {- X. ~( ^
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k$ K' m4 V% z0 X0 j
& E: c" w" r* d5 q% G5 B 会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
, F, _' _1 d) Y8 r 每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或) m) U! ~) o) l& O3 s
空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
2 M0 v# v$ g: p/ B; G# T 取得第二个符号,引用 %j 来取得第三个符号,引用 %k2 R2 m$ Q5 Z3 w: K2 G# v/ O
来取得第三个符号后的所有剩余符号。对于带有空格的文件/ N0 K$ x' C2 |4 G* q: ~: q
名,您需要用双引号将文件名括起来。为了用这种方式来使 s0 E" s4 o0 O# \) b
用双引号,您还需要使用 usebackq 选项,否则,双引号会# D6 E9 }% ^" v6 w
被理解成是用作定义某个要分析的字符串的。
* t5 F8 \3 t2 n( \( h) [; F& x! W; N# L! k" q/ d
%i 专门在 for 语句中得到说明,%j 和 %k 是通过
6 ^6 h# [6 ~6 t9 T" S" S6 E' a tokens= 选项专门得到说明的。您可以通过 tokens= 一行
" [* |- ]* _: f; i! ^' J% e 指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
- N( H6 L; o: B0 X" @ 'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
# y# N; K$ {9 j; A 同时不能有 52 个以上都在使用中。
/ q& p; `. B& c" e* Z- N+ t
9 j: \: x: L! w1 v( V 您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
$ [ Y; _1 a! K( H 用单引号将括号之间的 filenameset 括起来。这样,该字符. D# G8 c8 X! \4 ]! L
串会被当作一个文件中的一个单一输入行。
% c& B0 X$ z# _/ P# k3 h1 ~) K4 B5 p% a7 P6 C4 P
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将2 x: e% Q9 g7 D# M1 r* Y
括号之间的 filenameset 变成一个反括字符串。该字符串会! u; f4 v' a# }1 ]+ ?' X2 l
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
; I- _$ o9 f, z2 [; W) H0 m, J1 s 内存,并被当作文件分析。因此,以下例子:
5 K$ t& U' C, `/ w8 q/ x3 I
' }* D" t' C9 N5 G$ y FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i% m x& _, P# j
: r. N. c8 j7 V" e s
会枚举当前环境中的环境变量名称。
; [# w+ k1 Z4 u* R4 o4 c8 t: b- N, P% U9 V# }" K
另外,FOR 变量参照的替换已被增强。您现在可以使用下列9 A& h4 G6 _0 I9 ]+ I5 F
选项语法:/ \3 \* R: c& ?$ s5 e' @$ H5 m% r$ C( H
8 n9 d0 M% U) J: |) U4 C
~I - 删除任何引号("),扩充 %I) l% ]! D! Z; u1 J+ H$ i
%~fI - 将 %I 扩充到一个完全合格的路径名
9 H0 I% c$ o# ~. \4 _ %~dI - 仅将 %I 扩充到一个驱动器号0 B. ~) E! R! _: g9 Y
%~pI - 仅将 %I 扩充到一个路径" ]9 D% f+ D) ?2 P5 k
%~nI - 仅将 %I 扩充到一个文件名( z% b6 }( K' _7 [6 d
%~xI - 仅将 %I 扩充到一个文件扩展名: F9 |: ], D' O7 e: V* ]9 b
%~sI - 扩充的路径只含有短名2 h, A6 N# S9 Q, G4 d
%~aI - 将 %I 扩充到文件的文件属性% T3 y" H5 ~$ m' U
%~tI - 将 %I 扩充到文件的日期/时间
3 y, V T, i1 G1 ]* d- _ %~zI - 将 %I 扩充到文件的大小
( N5 D$ m9 i t$ L, W %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充2 J$ m# `: D. K) |
到找到的第一个完全合格的名称。如果环境变量名1 `3 B, a* \: h3 V1 ?
未被定义,或者没有找到文件,此组合键会扩充到
$ L- u( B; c I( D5 M+ s3 k 空字符串
, ]. K, f% }8 C) |
( C) o; @1 _, [- E6 z可以组合修饰符来得到多重结果:
. g2 N( b/ ~% X/ [; H
0 P. ^+ [* G$ `3 R4 f1 r) X$ T' [ %~dpI - 仅将 %I 扩充到一个驱动器号和路径
) L5 ~+ F* y' u/ T+ @1 G* ]1 } %~nxI - 仅将 %I 扩充到一个文件名和扩展名+ q# U* N$ s8 ]2 M1 N6 @+ k+ ?
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
1 H3 j5 c# G5 S& v %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
4 G7 Q: D) c: } 到找到的第一个驱动器号和路径。 " `" t# ?% U2 N2 t6 l
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
) P7 t) |+ Q+ b" v# O/ w- U4 k% }4 b7 }
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
6 Q6 B) o, b3 L/ B e$ b用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
5 o4 J: |4 Z1 ^9 x+ Z, J比较易读,而且避免与不分大小写的组合键混淆。
" H, V* ]% T9 d( N9 |- O2 |$ |) ]
- h9 [1 \3 A: L8 S0 s* c---------------------------------------
& r+ H7 p4 G+ c/ r" l4 a, p转自 http://www.cnblogs.com/tanzhiwei/
! O& i E6 h* q9 h5 J8 H$ y
, m: {0 X9 N$ Y9 P4 j4 \[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|