|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决4 @, r1 d! [; Y* y ~
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.
* q2 p7 E6 Q" K, D' U3 t1 I2 kDOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:
9 X' r- P, q3 h0 L/ q* m5 gfor /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"! C6 A, [* \2 R& A
这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.
& T% G& r. C) @+ J+ P: {# F: x5 S/ i% I* d4 X6 b" a7 X
& l+ B Z5 Y% Q. [' G" z& a9 ?' A1 F0 O6 j- e
% E/ V- d y- X* T
% S4 r+ A4 ?: v" q+ S
0 Y' w# z& J& t7 b& S3 I
! l2 G/ B$ H5 o- A' g6 y# m" [对一组文件中的每一个文件执行某个特定命令。
8 T5 Z/ e; _& V: H% p' Q; U7 I# s- y. J0 S1 v
FOR %variable IN (set) DO command [command-parameters]. c7 _& G: E' L4 P8 {
5 P: I" ^$ u2 B
%variable 指定一个单一字母可替换的参数。
# a; X& d, z) E (set) 指定一个或一组文件。可以使用通配符。
: G" r! `6 [, E# M p" b1 X command 指定对每个文件执行的命令。
, a' E- O7 L$ D5 F8 |( E- V command-parameters! ?% Z$ X: k3 G& g
为特定命令指定参数或命令行开关。
V( t$ O, `) t, d8 \. _4 o
" c+ ]7 P. [2 d3 B在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable " H7 j- p& |( V+ O4 \3 X
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.# P2 k) f* f8 K7 {8 l
0 ]9 g, P* w4 v* x7 B4 F, R
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到# W, k/ O- a& w4 N1 G7 b# r( B2 J* p
支持:' y2 c) D6 Y% W$ Y7 g* [" l
! D/ P6 [8 s; c6 ^
FOR /D %variable IN (set) DO command [command-parameters]8 F7 j8 ~5 Y, r" J. C1 E) |% z" q
5 q I7 m) s T 如果集中包含通配符,则指定与目录名匹配,而不与文件
7 D. F; ]# {% m' ]/ h, b 名匹配。0 F* Q9 f" z1 ~" S4 @7 H
" ^& _1 H: z9 _6 A9 b4 RFOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]: v# J# I- _, `/ V2 ~4 |+ V
5 W h# z/ e8 | g1 S6 a# p' T
检查以 [drive:]path 为根的目录树,指向每个目录中的! r. h2 [. q M. f6 u3 {, L
FOR 语句。如果在 /R 后没有指定目录,则使用当前4 |5 _/ z( W' m( Q S9 }
目录。如果集仅为一个单点(.)字符,则枚举该目录树。
6 q! i$ H& f) s& R$ I' A
! R! a7 T, l2 Z4 L5 r. P MFOR /L %variable IN (start,step,end) DO command [command-parameters]
* r' L2 t% N: `
( W. }- W# g0 K0 D( i! j- o! Z 该集表示以增量形式从开始到结束的一个数字序列。: Q$ A! J& [) F) f0 l
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
4 X" F4 T7 O1 U. e3 {# V. g 序列 (5 4 3 2 1)。8 K2 [: l- l# Q# r
- R" O0 X# I6 b6 I$ n
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]. T Q' o8 m @: R# F! S A
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]0 y1 K4 M2 R7 `+ l9 p
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]! G3 A/ b8 A# Z# h/ N
" V3 f4 b& ~& S2 N. t% }2 b 或者,如果有 usebackq 选项:
+ t$ t: @- ^/ {# r8 e5 c
, t- M- @/ y* E3 m) pFOR /F ["options"] %variable IN (file-set) DO command [command-parameters], J' ?- V# X' |7 j
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
' g$ k" R* Y) N3 ]/ ?FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
/ X+ g; W" {! q( f4 f- g9 u0 o# [) \( o. g Q9 {7 O, V
filenameset 为一个或多个文件名。继续到 filenameset 中的
. B, Q" p+ d' x" z- J, i0 w 下一个文件之前,每份文件都已被打开、读取并经过处理。9 L w+ r- j' z5 X
处理包括读取文件,将其分成一行行的文字,然后将每行3 q Z3 U$ n4 ]
解析成零或更多的符号。然后用已找到的符号字符串变量值# z& j1 ~9 J1 b) T
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
- }/ Q* a' Z0 i/ h- B! @ 的第一个空白符号。跳过空白行。您可通过指定可选 "options"
6 J; m. `: y0 ]! [# P5 h' P4 m 参数替代默认解析操作。这个带引号的字符串包括一个或多个# a1 r. [0 j1 ?- Z* @
指定不同解析选项的关键字。这些关键字为:# d; e/ j7 w7 W x3 X- e. R) O
, f- @- W; f, \! W8 O8 e
eol=c - 指一个行注释字符的结尾(就一个)3 k8 q' F: i: i7 _2 v+ i, D
skip=n - 指在文件开始时忽略的行数。0 `5 G7 C' e8 S* a! e; j) m$ X/ c! u, Q
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
# ?% C( }7 J6 b v 默认分隔符集。
! r6 n( b1 T q2 m5 U: W) S tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
% D* Q/ N( g- |4 ~0 v7 ? 的 for 本身。这会导致额外变量名称的分配。m-n3 p- S# w, e& ]; n9 N* E
格式为一个范围。通过 nth 符号指定 mth。如果0 t6 E$ O7 U6 T+ B! \
符号字符串中的最后一个字符星号,
) E$ N. F5 O8 Z: A: j4 H; b 那么额外的变量将在最后一个符号解析之后7 g; D6 c- }& }
分配并接受行的保留文本。) b5 z& C6 c) o. e- } V7 n0 K
usebackq - 指定新语法已在下类情况中使用: / v4 C. o" z4 b8 J9 H1 R2 R
在作为命令执行一个后引号的字符串并且一个单; r! D6 d" M1 e+ X1 _( o
引号字符为文字字符串命令并允许在 filenameset, ~! J1 Z' ~! ]; S, v
中使用双引号扩起文件名称。
N# s b" q b6 L/ R1 p' H$ V& |! x" q# ]
某些范例可能有助:, K. q2 H% w7 s* b/ V% u" R
# ~! x. Q( s5 {' ^. q- PFOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k; v" C/ f- `- t+ s: A
- q) r; {4 m) ?2 l4 b' Q; H6 d
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将$ {- S) z: m* f9 y3 o* k' d1 ^
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
: y2 ]% T% V$ K/ J0 V' _+ f$ ]: ] c 空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
6 Y6 J. }3 }( b+ i( P" u9 F 取得第二个符号,引用 %j 来取得第三个符号,引用 %k
3 s7 I7 b5 g+ S8 D0 E 来取得第三个符号后的所有剩余符号。对于带有空格的文件; H) T; [! M8 m. k2 X, |
名,您需要用双引号将文件名括起来。为了用这种方式来使3 U! M% s0 A; \! P0 q* d! P' W
用双引号,您还需要使用 usebackq 选项,否则,双引号会
$ C2 s! |4 u* H8 D' K) q 被理解成是用作定义某个要分析的字符串的。
- B0 a6 L; t. ^) L* U3 M/ k3 \2 r3 o
%i 专门在 for 语句中得到说明,%j 和 %k 是通过
1 ]+ T& _0 X+ m& ~' @- D tokens= 选项专门得到说明的。您可以通过 tokens= 一行
$ @; S; z9 [( f+ n5 b 指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
. j7 h' i+ `0 @ 'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
% ]8 A+ a1 O U7 e 同时不能有 52 个以上都在使用中。) A+ a! F) K2 P6 u1 q
! N! H' f6 N8 w7 Q3 b8 F, X% ]; e
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,1 t- z8 ~0 u* }: [
用单引号将括号之间的 filenameset 括起来。这样,该字符, d9 ?; Q5 B+ ]' C: Q
串会被当作一个文件中的一个单一输入行。9 B$ t6 u, P' n; ~3 d' r! I+ g. G
! z& I+ m0 a' N$ g+ T: e
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将" D2 r0 [+ n: G- |6 @4 z7 S# c
括号之间的 filenameset 变成一个反括字符串。该字符串会. }. b8 c* Q N; F7 y4 I
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进: F R' g2 y! M$ ~' A) [$ J- l
内存,并被当作文件分析。因此,以下例子:
4 m3 X9 l' a- g. r$ p5 d! f7 k
* A4 t9 G, }' o8 { FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
" S3 x6 D7 N' n6 q% R2 {; F2 l# b' R+ L5 f
会枚举当前环境中的环境变量名称。. \5 p* T0 K) t( Q" j w/ v+ \. o7 ^
( Y1 k+ b+ i# w/ ]% I" z' Q9 ]" x3 R$ M另外,FOR 变量参照的替换已被增强。您现在可以使用下列% r/ P% W# K2 ^
选项语法:
# b1 v8 F+ _+ I
' L. _! s" i) @: E# ]* r ~I - 删除任何引号("),扩充 %I
7 |1 h5 { {% ?3 P9 Z %~fI - 将 %I 扩充到一个完全合格的路径名
1 ~& _; D, U/ D# S %~dI - 仅将 %I 扩充到一个驱动器号 ~" e2 G5 V4 v. \2 m( P8 f
%~pI - 仅将 %I 扩充到一个路径
0 Y8 E0 n2 v4 W/ O/ @ %~nI - 仅将 %I 扩充到一个文件名
7 K: }, b q, }5 v %~xI - 仅将 %I 扩充到一个文件扩展名5 @. m2 C8 y' ?) H
%~sI - 扩充的路径只含有短名( t. K5 P/ H/ b7 _4 F2 Q7 ~
%~aI - 将 %I 扩充到文件的文件属性
% U8 q. ?3 F5 q9 F) W %~tI - 将 %I 扩充到文件的日期/时间8 r/ _* v$ o' D$ l
%~zI - 将 %I 扩充到文件的大小
- U- R1 R$ j' @0 ?- V* O5 B, b %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
" B! E( T/ r7 t( }# Y! x 到找到的第一个完全合格的名称。如果环境变量名# ?0 ~$ [8 B9 T3 V, ?
未被定义,或者没有找到文件,此组合键会扩充到7 Z" s* h: J0 V/ T# P5 S
空字符串2 B- P( G# q Y9 ^
V9 k% W* w5 C L: }- y
可以组合修饰符来得到多重结果: ^/ d% @4 `2 c1 M9 k ?! p. O3 p
+ Z5 c4 z4 J: ?2 H8 B* @
%~dpI - 仅将 %I 扩充到一个驱动器号和路径* r' h; y0 \. H) ?
%~nxI - 仅将 %I 扩充到一个文件名和扩展名( \# `# ~. Y ?, j# A
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名4 H+ ~% Q# {% M( U) f
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充/ t) d& Z+ P6 v1 Z
到找到的第一个驱动器号和路径。 * A! F' P% N- d( ?3 c4 F
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR/ {7 R, ~. H) f
( _: ?, l( b" |! ~# Z0 t0 F
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法) C4 o8 o5 T- A1 t( \1 A& \
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名: {2 w& \8 e5 x! A2 Z. J* [
比较易读,而且避免与不分大小写的组合键混淆。
% Y# O+ c5 R" e- ]8 ]/ H) K/ ]' H9 \2 y0 d
3 k) Z- |+ N3 u! M---------------------------------------
3 f9 k1 l3 n& {8 x b转自 http://www.cnblogs.com/tanzhiwei/9 A5 P) W+ }& N: e K
* H" x+ O( }( t- {5 P" K4 q
[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|