|
|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决' X" J' E* k; `: R
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.: o* B' O; X. e, s G
DOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:9 L) F% u! `1 ?1 c
for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
7 k& u: ~' }$ T) x: `5 C这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.. w! o" E- d" Y4 Q7 ~" P4 U
7 |4 Y* H+ w1 Z9 g
: G. S5 X; d- G; d
/ h G+ J6 b; ^& U( f- Y9 R. n# a
4 P2 g( t3 R$ e
1 P- p: j; e1 O( y" w* U3 f% b5 u, e# W7 _! w: c# f) B
对一组文件中的每一个文件执行某个特定命令。" D# m: d! \# R0 L/ a# N1 F
' P, u5 O! @# T& Q% u9 ~FOR %variable IN (set) DO command [command-parameters]0 O* U8 {& I/ N' z: N3 ^! M. p9 h
' u: c* z& [8 ~# x( ^) X% H
%variable 指定一个单一字母可替换的参数。' p7 j( \/ C3 B. q5 G& {+ v
(set) 指定一个或一组文件。可以使用通配符。, d; ~$ B' i8 Q$ b; H, k
command 指定对每个文件执行的命令。
; g% t& |4 e3 g7 D R command-parameters- M- J$ Z: \7 |
为特定命令指定参数或命令行开关。5 ^) ?$ p' x3 T5 [& k5 g
: d* Y6 n! ]6 [0 R在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
/ B% q" G5 w3 _; L1 w1 H. M3 q而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
! a0 ~/ D J5 s6 n0 p. r
& Z: q- o1 |& Q( d8 E& t如果命令扩展名被启用,下列额外的 FOR 命令格式会受到' V, x/ w8 o0 v$ R
支持:% C2 f Y; {2 m; _5 z& A/ p, B. d
/ S' b3 C! p- p* O, j% B. p$ a5 OFOR /D %variable IN (set) DO command [command-parameters]; Z! Y9 Z+ a( g% X' d1 b" J
1 k) g# |" T, l 如果集中包含通配符,则指定与目录名匹配,而不与文件
! k, P. G0 @* l1 L 名匹配。
( l) f& B* z6 F/ e0 H0 u" Z9 K% Z: |$ O
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
+ q4 k2 ~$ y6 ]" D$ o8 [, t5 P% T& ?# A9 O# Q+ s
检查以 [drive:]path 为根的目录树,指向每个目录中的
; A/ }9 s) J; d' E1 ? FOR 语句。如果在 /R 后没有指定目录,则使用当前
! H A0 r4 F7 y; d) j 目录。如果集仅为一个单点(.)字符,则枚举该目录树。
- H4 x7 v2 R/ n1 R- G2 T' n
, T5 ^! h$ x7 D2 EFOR /L %variable IN (start,step,end) DO command [command-parameters]
. i0 H( m0 R& C: y; F
, q$ X$ _1 W* T, z# z, T; N4 [8 [ 该集表示以增量形式从开始到结束的一个数字序列。% D7 Q/ r7 n/ K2 D' m9 Z+ R
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
* f& }' i, l8 K7 Y; s5 } 序列 (5 4 3 2 1)。5 M p/ ^7 T) p4 `) {' w' `
( u. ~' U0 I# x, `% N5 BFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]- [4 j3 x6 Y3 R* b. w
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]* V; E1 e% D- `
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
7 o9 i# Z; y; o: L G! ?0 i; @3 Y& y+ P
或者,如果有 usebackq 选项:
' y- l* [: m( Y: {
6 s8 B. b) W+ _2 c6 gFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
" W" ^# p" F8 B8 QFOR /F ["options"] %variable IN ("string") DO command [command-parameters], m' b; K! z5 B% }
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
/ i, ^; F. X* k" s4 @( t& O8 O4 s5 m9 z# d; R) M
filenameset 为一个或多个文件名。继续到 filenameset 中的
( G' T( `2 i, i: S* n1 ^ K 下一个文件之前,每份文件都已被打开、读取并经过处理。
; J1 q I' c$ {1 X4 h( g5 W8 T7 V# C 处理包括读取文件,将其分成一行行的文字,然后将每行
7 o. O, P- d ]0 F' E1 d 解析成零或更多的符号。然后用已找到的符号字符串变量值 ~& K% E' T5 ]! K* g7 [$ ?
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
: R& W3 T' h. E 的第一个空白符号。跳过空白行。您可通过指定可选 "options" - o( o8 e0 q( j
参数替代默认解析操作。这个带引号的字符串包括一个或多个& g) y* ]) w, l4 j
指定不同解析选项的关键字。这些关键字为:
& `( N8 r m5 R4 _3 q- a; `
, h2 x L" o5 S: @5 } eol=c - 指一个行注释字符的结尾(就一个)
4 e1 }% ?* @) h3 J0 c skip=n - 指在文件开始时忽略的行数。
F+ P b4 \$ X8 o delims=xxx - 指分隔符集。这个替换了空格和跳格键的
4 g$ V0 K6 A" U7 u9 i 默认分隔符集。
& @! B4 @" c8 s; U( B tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代% F- T* ?" X0 Z$ {9 C1 f+ Z; u/ e
的 for 本身。这会导致额外变量名称的分配。m-n
: X5 q/ `" H% }# l: w" J! O 格式为一个范围。通过 nth 符号指定 mth。如果
# \% C' _7 z' E 符号字符串中的最后一个字符星号,- u" _, W! Z" T
那么额外的变量将在最后一个符号解析之后
; X2 n1 i( {" T8 n2 \! E 分配并接受行的保留文本。3 E; e$ p2 R# v1 U3 L& h5 y
usebackq - 指定新语法已在下类情况中使用:
) \) [# o2 v3 A% t 在作为命令执行一个后引号的字符串并且一个单
& L8 H2 s1 Y# h4 S 引号字符为文字字符串命令并允许在 filenameset
: a, ~ m o% `6 b- a: H; W: m$ O 中使用双引号扩起文件名称。
, I3 X! ?7 c' C- m$ P& K0 N% \
5 }+ k* |8 k5 ]" [ 某些范例可能有助:9 |0 c) G/ F/ C7 v
' T+ u' G9 X l; E8 B; L6 ?' `( b3 J
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k! p% X6 ~: ^! `3 L9 V j7 i% M* r
, J" L& R2 D3 l) g2 ^$ J 会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将& Q9 A* h7 D* }! C A/ F
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
3 h ]- C3 b! K' h3 q/ c- D' ~" A 空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
9 J$ g3 r# `) q0 p- [5 a9 T/ G 取得第二个符号,引用 %j 来取得第三个符号,引用 %k
7 g: d# B3 R3 S$ \ 来取得第三个符号后的所有剩余符号。对于带有空格的文件
1 @/ b3 ?' K- Y, S% E( h7 B R 名,您需要用双引号将文件名括起来。为了用这种方式来使- w7 p7 F$ m/ J1 Z6 ]) _8 G4 f b
用双引号,您还需要使用 usebackq 选项,否则,双引号会/ B+ t! M& t; {7 ?0 B* w Y- i
被理解成是用作定义某个要分析的字符串的。
* l8 W7 A* e2 n' h. i" h
* \6 W) j# u1 w" H5 d. T# \, ^ %i 专门在 for 语句中得到说明,%j 和 %k 是通过
$ S" s. |, n8 X# y3 X+ U tokens= 选项专门得到说明的。您可以通过 tokens= 一行& `4 c( k5 ^! T4 m+ S: `4 Q. t
指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
+ t T: F1 v- \ 'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,$ H0 \0 X# r% d6 s1 H
同时不能有 52 个以上都在使用中。
2 L) h. r& {% z' {, i- B9 d6 {% v7 M, z
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
! N F; |4 D9 u) } 用单引号将括号之间的 filenameset 括起来。这样,该字符
8 L( Q; }) p- f3 W: s 串会被当作一个文件中的一个单一输入行。
; z/ N; }4 R. `- d4 { N. [% [+ a$ U. [
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将/ h$ [4 s, N1 S4 h: E. {$ j* J
括号之间的 filenameset 变成一个反括字符串。该字符串会0 ~: E1 b, u3 ? P* p
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
: b/ z" j- P3 c0 m. h% F3 @% N 内存,并被当作文件分析。因此,以下例子:
: o h) d5 Y4 ], W7 |/ L. G4 ?: W( g1 m' Z% R I. B
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
+ o: R& g5 H0 |* Y& G* A, l6 y0 ^1 O5 U# ?) G
会枚举当前环境中的环境变量名称。
0 ^- N4 Z: m$ L8 `2 i! {- W
0 O- X- p8 K- E% r7 Q. }' `另外,FOR 变量参照的替换已被增强。您现在可以使用下列: Y. X5 v. B3 I. g' |( H8 Z
选项语法:
: e5 |7 l8 w# n ]8 E1 s, j; l, ?7 N/ C& h: T, T# L! m, z
~I - 删除任何引号("),扩充 %I
: ]( [: l5 u) N$ w1 N' _ %~fI - 将 %I 扩充到一个完全合格的路径名
; D8 P9 V, g$ u3 o7 N5 X3 g& J, x %~dI - 仅将 %I 扩充到一个驱动器号
: J$ O8 \ u2 x6 J, Y* n+ D %~pI - 仅将 %I 扩充到一个路径& F: r Y, y3 _1 n; I% [; z* @
%~nI - 仅将 %I 扩充到一个文件名
/ m5 S$ Q8 ?2 l) q0 J$ _& ]2 x6 ^- \ %~xI - 仅将 %I 扩充到一个文件扩展名9 u3 r- L* I6 {- B
%~sI - 扩充的路径只含有短名
- N6 y) I6 `. G% P; y %~aI - 将 %I 扩充到文件的文件属性
z$ F/ S; P2 y! d: s6 {* f %~tI - 将 %I 扩充到文件的日期/时间
) F9 t. N6 W! U4 }$ S# @+ N' F O0 A% g %~zI - 将 %I 扩充到文件的大小
. ?, k9 K9 @" I6 H: ?5 r3 g %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充 H% I2 w1 k9 J5 x
到找到的第一个完全合格的名称。如果环境变量名, r- B! t& p' G: A- I
未被定义,或者没有找到文件,此组合键会扩充到; j- i& ^( }: s" i
空字符串- v U5 ]% @ u# \& i/ ?
, R; ]' i2 s; `& J6 g: r
可以组合修饰符来得到多重结果:) O8 U# T7 I+ Q* e1 {2 E, m
7 R! N, v2 ^( {( G. l %~dpI - 仅将 %I 扩充到一个驱动器号和路径
; f/ N1 X1 Y: p1 k1 c %~nxI - 仅将 %I 扩充到一个文件名和扩展名
# d9 c% Y# w$ |$ \, ?5 ^' t %~fsI - 仅将 %I 扩充到一个带有短名的完整路径名1 V/ E8 D: ]: G. K- _
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
( a0 ]) ^/ u4 | 到找到的第一个驱动器号和路径。
5 ~. A4 K! W9 Q( M0 r( O. z %~ftzaI - 将 %I 扩充到类似输出线路的 DIR, s2 A! ]8 u) H, m5 p P n* b
_+ t! v* Y, J7 N; w* E在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
! o0 D- x% l' }% {6 a1 H" i7 i, b用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名6 i/ X- N7 a$ w! j
比较易读,而且避免与不分大小写的组合键混淆。
; I0 R4 j( g3 e7 M$ C0 z! \; }' N4 ?# g: c1 @" G0 _3 |
8 U; J/ p s3 [( h8 u) F" T---------------------------------------& }8 `( p( ?8 ?! P6 b1 |4 Z. S
转自 http://www.cnblogs.com/tanzhiwei/& P, ?- D. `+ ]2 z) y) H
7 F1 g3 N6 x( E0 `$ Z7 i( Q
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|