|
|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决9 e8 S2 w2 Q7 T& G% F
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.
6 [3 f! S& r& E) [& I6 @" tDOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:
8 r' [ b1 r+ Qfor /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
4 q5 Q' a6 w6 h s这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.# {$ R0 Q+ g" u# j! M: w9 s
. v% J% H5 g5 {, Q8 X' R
6 f; ~: t1 ~' F7 b+ d
* F3 N* S5 J! K: L% x6 B3 B6 E; l4 \1 U$ [2 {* {& b
3 y, J2 V& G6 i- h3 j \6 p9 @6 j" Q9 Q+ c
# j9 G% [, S1 }& G& h1 u
对一组文件中的每一个文件执行某个特定命令。
8 z" w! |5 x" P0 h% v6 G3 f* Y# x2 l+ s) M5 O5 U! w
FOR %variable IN (set) DO command [command-parameters]1 p5 m) N7 G0 }5 D+ w( {- E4 L$ h, v
' l3 {2 t5 g+ ] %variable 指定一个单一字母可替换的参数。
5 _9 h' [: y3 w: c (set) 指定一个或一组文件。可以使用通配符。
3 n- ^+ T" y4 u' g, j8 m2 N command 指定对每个文件执行的命令。. |+ ~3 \2 q1 D' Z4 b! ^# ]
command-parameters3 o+ g( B& V) I- c+ o9 y3 q
为特定命令指定参数或命令行开关。
9 T0 a4 V7 _1 a4 U, S5 d
+ T: |2 }7 y& M% x& ?在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
- l# `' _9 {$ p而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.6 |# A/ H& M9 C2 r
2 V* h% b# l& j8 k8 i/ Q4 J
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到0 {5 q2 B- L/ b+ _1 ~- d( {
支持:* Q) ]- G0 I, ?- Q$ p/ d0 G1 Z
* x/ g: y: b; Y, N- aFOR /D %variable IN (set) DO command [command-parameters]
0 w& W8 z1 }7 ~( Q- z) v
6 E% i" }# X( p, s8 s, v" X: \ 如果集中包含通配符,则指定与目录名匹配,而不与文件
- q, y7 }+ w: k0 N B; Q1 e 名匹配。
( M2 B- B% _6 c- Y* Q* b: Q8 c; @- p
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]2 E5 v$ e) r1 Q5 m. f$ J
, i J$ G! o! b0 k$ ]7 U6 U
检查以 [drive:]path 为根的目录树,指向每个目录中的. f+ }9 Z! l+ Q7 F
FOR 语句。如果在 /R 后没有指定目录,则使用当前
* ]8 l9 R" L6 N8 }+ ~7 i8 s5 e 目录。如果集仅为一个单点(.)字符,则枚举该目录树。
4 Y; q$ V6 r8 T1 g" x
' a$ F( U" d" v6 z) Z- ~4 q4 ?FOR /L %variable IN (start,step,end) DO command [command-parameters]
1 ] v i( _1 p; }( P, |' q5 ]4 P, v2 `8 i# X
该集表示以增量形式从开始到结束的一个数字序列。
8 c- T. x( I0 e9 o4 E0 \ 因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生1 T, }' u( ^& ]: n2 b
序列 (5 4 3 2 1)。
$ Z4 j2 }: t# U$ b1 Y4 s- r9 C, E9 s7 o- f3 e
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
3 X3 U! n$ d: NFOR /F ["options"] %variable IN ("string") DO command [command-parameters]
1 U# @5 K- g2 D* V" e. ^7 B3 g2 [FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
1 T, v* A) c! T+ I6 }4 }4 k- ?( n3 s0 a- c6 H2 Q3 u
或者,如果有 usebackq 选项:
3 l% I/ f, r; ]. u7 j, a( {5 t& A; K w
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]" o! S1 o( \! D1 k: h
FOR /F ["options"] %variable IN ("string") DO command [command-parameters], [$ N( f( x# C$ A( ?% ^
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
! j# d( S4 ` Y; m2 A7 Q
0 q+ w1 Z; W$ u: L& l filenameset 为一个或多个文件名。继续到 filenameset 中的5 _2 _0 S G4 x" N5 ~% v- u
下一个文件之前,每份文件都已被打开、读取并经过处理。8 q" \( Y7 ]0 a H6 y
处理包括读取文件,将其分成一行行的文字,然后将每行
6 s6 r/ ?# m) h 解析成零或更多的符号。然后用已找到的符号字符串变量值+ U" l2 p* u) }2 [
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开& X. P& M- `% ~4 I8 z! g( C- u
的第一个空白符号。跳过空白行。您可通过指定可选 "options"
2 I9 Q* e% J& Q2 ^% D& | 参数替代默认解析操作。这个带引号的字符串包括一个或多个7 ?7 M. U- H+ M" E3 R
指定不同解析选项的关键字。这些关键字为:
6 U( O6 J2 I- F0 s) X9 _3 {$ T$ O0 Z- [* y
eol=c - 指一个行注释字符的结尾(就一个)
( \- ~% G- N" z2 v3 b skip=n - 指在文件开始时忽略的行数。# T* |7 O0 A) x. ~7 Z& f
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
0 o0 Z* x4 r: m( q 默认分隔符集。* H( P! a+ I" m1 b1 v9 i
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
% D3 P. C) N& v* o* R& R 的 for 本身。这会导致额外变量名称的分配。m-n
% n2 X _# a$ W. s3 j 格式为一个范围。通过 nth 符号指定 mth。如果7 q, K6 A- l- {% |6 \+ R# n
符号字符串中的最后一个字符星号,7 k: O6 t8 L2 y- g/ k' V
那么额外的变量将在最后一个符号解析之后
' ]3 E) G0 E9 M! `/ R" L 分配并接受行的保留文本。0 N6 w, [( |3 v z7 H' c
usebackq - 指定新语法已在下类情况中使用: ( R% J0 o+ L$ @+ W0 b2 t
在作为命令执行一个后引号的字符串并且一个单
- w+ H0 O+ q1 \ 引号字符为文字字符串命令并允许在 filenameset o& }/ b/ o5 O* \( M
中使用双引号扩起文件名称。+ s, A" Y {: t% R9 z9 {8 K
5 K# c! T9 a4 S$ S/ Z
某些范例可能有助:5 @& h0 c0 g% p5 }- `. G+ f
' t. K. I& r- q
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
. C6 f6 h' \- K5 p/ F# o! f) D _& Y
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将+ q) L# b1 g- h! q" t. ^
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或7 F8 ]5 H9 U8 i
空格定界符号。请注意,这个 for 程序体的语句引用 %i 来4 G$ n( u8 K2 z0 k7 {4 n' {
取得第二个符号,引用 %j 来取得第三个符号,引用 %k% w0 x( K6 a' d4 r D$ V
来取得第三个符号后的所有剩余符号。对于带有空格的文件
% X# q, ~/ V: p! O 名,您需要用双引号将文件名括起来。为了用这种方式来使8 U% t7 G; K9 P+ b* {
用双引号,您还需要使用 usebackq 选项,否则,双引号会
5 {% o$ C0 `/ h; b: z0 L+ } 被理解成是用作定义某个要分析的字符串的。/ D% I; P1 `! X, s) Q! j
7 F d# \+ d: q- i! Y %i 专门在 for 语句中得到说明,%j 和 %k 是通过
: g) u, e8 }! y# u: s tokens= 选项专门得到说明的。您可以通过 tokens= 一行8 ?! G) t8 [9 {
指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或& n c) M/ H; i4 P
'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
# M$ ?9 g/ s6 a; ` 同时不能有 52 个以上都在使用中。
) d/ \8 u6 E3 }; r7 Q
) M3 A6 B' g) c, {# ^/ j2 n4 a8 j 您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
3 x5 g" I2 S+ Q# b p L; p$ c 用单引号将括号之间的 filenameset 括起来。这样,该字符- g( Q b) w& A: S+ b, i. c
串会被当作一个文件中的一个单一输入行。
# O8 B# H, W2 G* _8 _. b' S0 D2 y& T1 B4 G# k
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
0 d, i/ O6 n5 ?. }; h1 I$ C9 w, S( N6 J 括号之间的 filenameset 变成一个反括字符串。该字符串会
0 |8 }9 F m" F4 z1 P 被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
. v+ i4 v/ F7 ~3 J: ~- D% G 内存,并被当作文件分析。因此,以下例子:
+ ]( l2 H. ~! q6 i. |; j+ a. x X" ^8 t$ x$ A+ x. z
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i5 P! j& t6 ]7 {/ M7 Z; T$ }
6 O8 }1 F+ i/ Z9 q. [4 ?( M# C8 `2 H 会枚举当前环境中的环境变量名称。
$ i. ?) g: R) T& \
8 F: `: H9 ]( T4 a- S, S另外,FOR 变量参照的替换已被增强。您现在可以使用下列3 h( _7 N5 @" C7 V+ O0 y+ {
选项语法:9 {# V/ _0 j, l: A
5 F+ ^- I. M* }* q% n0 I* I: m ~I - 删除任何引号("),扩充 %I% v3 {! n! I! Q8 |
%~fI - 将 %I 扩充到一个完全合格的路径名8 m/ ]# L' Y7 s. T7 n
%~dI - 仅将 %I 扩充到一个驱动器号. k/ ^7 G, g& z+ w2 k4 u
%~pI - 仅将 %I 扩充到一个路径. v) f& A# }5 r8 B' v# r* e
%~nI - 仅将 %I 扩充到一个文件名% G4 h6 x/ x' c0 p2 k
%~xI - 仅将 %I 扩充到一个文件扩展名
# a& {- H8 d. y %~sI - 扩充的路径只含有短名
3 a/ Z7 J5 K1 ]' d" |) V' I2 @ %~aI - 将 %I 扩充到文件的文件属性" d3 X0 D6 H, p5 X% i: k; t9 Q, d
%~tI - 将 %I 扩充到文件的日期/时间
6 H9 n6 l4 E _5 [ V %~zI - 将 %I 扩充到文件的大小0 t( l7 o2 n/ i
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充8 ^2 h5 ?( a* s2 D3 | G& J
到找到的第一个完全合格的名称。如果环境变量名- R8 u) N4 ]% @3 s5 [
未被定义,或者没有找到文件,此组合键会扩充到$ [" }) k5 V0 l5 m# A1 L' b
空字符串" N. T: P8 i( g+ r8 w
+ h. j, B* z5 _8 m) c可以组合修饰符来得到多重结果:
4 ~: H# `, i' K- y1 Z W# U4 ?1 V9 ]! {& N% x/ p( e
%~dpI - 仅将 %I 扩充到一个驱动器号和路径
; e/ q: T" c) {9 V% `5 n %~nxI - 仅将 %I 扩充到一个文件名和扩展名& m, j# K1 M8 u* I
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
. _9 L3 o" C/ ?, Z, ` %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充/ U+ n1 t i) y8 y4 E" [- N- S) W
到找到的第一个驱动器号和路径。
l0 H$ Y2 j" ?* q4 v2 v7 e p %~ftzaI - 将 %I 扩充到类似输出线路的 DIR
; n& M7 y( w' ^7 o o4 j
8 r8 ^* W8 ?, g/ ], D- a9 M在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法7 F# @- I, H- w7 O6 d8 K
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
" g5 @( _) O- l4 ~9 Y% x" s比较易读,而且避免与不分大小写的组合键混淆。
s" ?* |2 S! v8 ?1 e% D1 V7 z) C( `1 j9 g1 M
& `, m0 G0 n( [3 Z! |---------------------------------------
5 G/ h! y, l6 q8 x转自 http://www.cnblogs.com/tanzhiwei/0 J3 o& ~4 j4 V2 ^5 i
) o/ m5 Y$ D7 z
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|