|
|
对于网络工程师而言,很多情况下都在测试网络通断情况.在手头没有应用工具软件时,使用DOS这个很多人已忘记的工具,有时候能解决+ p! u0 `8 O" j Z w
不少问题.虽然DOS没有LINUX下的SHELL语言那么强大,但必竟是WINDOWS下的SHELL.也能干不少事.0 P6 _* L% t* t" K4 e4 v
DOS命令提示符下,变量使用%来引用.在DOS处理中,变量使用%%来引用.下面看具体例子:, ]9 N" U: T& i+ D+ H
for /l %a in (1,1,254) do @ping -n 1 192.168.1.%a |find "Reply from"
5 G9 k1 B6 D' z7 d4 d这条命令直接在DOS下执行,过几分钟,可看到局域网中192.168.1这个网络地址段的可PING通机器的IP地址.& {, t U9 f' ~ H1 _5 g
/ i9 K) l3 S- e( ~3 `& x% j% ?
9 R4 J! @# N7 U, P! m- F* h& N7 ~; e! |) W# P: \' [! L5 L( P+ }
' s0 M, ]0 p5 g5 u$ I' X! k9 {' r" \
5 u ]) N$ V2 H# ^$ y! B1 J1 ?0 G
4 I' U% n5 U4 Z9 C9 {5 i4 V7 t对一组文件中的每一个文件执行某个特定命令。$ p+ `" O: ?9 F" b$ ]7 y9 q
+ \% u+ p' p( }* W; j+ H
FOR %variable IN (set) DO command [command-parameters]/ j2 _; J8 |4 n5 C( s' C' q* ^) g
: u! f( ^, Z% p2 `6 l3 X %variable 指定一个单一字母可替换的参数。
% b2 Y& A8 Z, g (set) 指定一个或一组文件。可以使用通配符。2 j, L! |: c- I- t) `
command 指定对每个文件执行的命令。
3 z. G; D+ z5 S% s: F t* e command-parameters
( I1 ^0 Q. X! W, F' s1 R5 w% }0 O 为特定命令指定参数或命令行开关。
# P( G4 X3 ?4 b8 u* a" e0 o( I7 s0 v
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
( G2 t- ^- _ u而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.! ?. } k$ V% H
( l& \2 A* R* k x* T; P( I
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
3 |& J2 c( @ u- @- X# B支持:
. N& g0 t$ t, @- n
9 y1 R& |/ u' T! H7 V7 mFOR /D %variable IN (set) DO command [command-parameters]
& b* O( O, o5 J# W# `+ c- n4 A i% ~/ a) Q3 T0 S7 }# V4 s
如果集中包含通配符,则指定与目录名匹配,而不与文件# v# c" G* f8 ^
名匹配。
2 w; I2 B1 Z' v+ n! K b) K H/ c* M, N9 m: o
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
& M4 _# y) O, S" s, A0 W. d/ d. F2 r# E
检查以 [drive:]path 为根的目录树,指向每个目录中的: e- i% u! r% d0 L7 K5 d
FOR 语句。如果在 /R 后没有指定目录,则使用当前3 A8 s' A# v6 G# Q& h8 n
目录。如果集仅为一个单点(.)字符,则枚举该目录树。! J( O$ C7 w1 N
- ]/ x' |0 d7 l$ i; @
FOR /L %variable IN (start,step,end) DO command [command-parameters]. M9 J' k) d9 i: C
8 w9 y! ?% x: D
该集表示以增量形式从开始到结束的一个数字序列。
I: E9 k( _9 R; ` 因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
$ Q, g* c. \3 E& p8 D" k9 F* ~ 序列 (5 4 3 2 1)。
. a+ X- C8 n$ |. a5 \! t- E r% u" D
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]# o' R: ~6 Y* ~' r& R
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]) c9 l6 n4 L1 M5 N+ f6 {+ c
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
3 A+ s- g: U( C! e* |
- A- E' X+ d0 g! L 或者,如果有 usebackq 选项:: i3 v# A: H* x* A, ^ ?
, L7 ^$ ?& {+ }- x+ wFOR /F ["options"] %variable IN (file-set) DO command [command-parameters]' ]$ b' U* } H6 N/ f' }0 `
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]1 q- T' z3 k( h7 f7 _8 V2 L
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]; O5 U* h5 P, R8 A
% K- Q6 w4 D/ K" G! Z5 N. r" F+ A* H
filenameset 为一个或多个文件名。继续到 filenameset 中的
3 N' }) x* x$ Z- i; d$ D% x+ F 下一个文件之前,每份文件都已被打开、读取并经过处理。! ~) e9 W2 x) |7 F- G
处理包括读取文件,将其分成一行行的文字,然后将每行
0 W5 T/ \5 A9 i; @+ u 解析成零或更多的符号。然后用已找到的符号字符串变量值1 i" E6 N) l% w
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开- C! P- a1 D3 I6 y2 O% H4 e: A
的第一个空白符号。跳过空白行。您可通过指定可选 "options"
; }, e( P* n: Y 参数替代默认解析操作。这个带引号的字符串包括一个或多个7 G) m I8 B4 D) W9 U
指定不同解析选项的关键字。这些关键字为:
- Y0 O* u/ ?+ u! E( L2 S
+ [) e) |$ e4 X" i( K2 I' v eol=c - 指一个行注释字符的结尾(就一个)' M; j: H" P' x2 p& h% B
skip=n - 指在文件开始时忽略的行数。1 f! o2 a0 j7 T2 {8 c
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
* I9 C9 e8 D! O/ M 默认分隔符集。( K5 L4 M( p+ v' @8 g/ z
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
0 t. }4 Z3 s- s; j 的 for 本身。这会导致额外变量名称的分配。m-n1 ?# s5 O- L# k9 T5 R
格式为一个范围。通过 nth 符号指定 mth。如果% e. \7 B5 E. a: H; J8 d8 P# y1 S* K
符号字符串中的最后一个字符星号,
1 a" o/ s$ ^# Y$ t5 G' j5 l 那么额外的变量将在最后一个符号解析之后
, C! Q/ u' S0 B8 ?5 R ~ 分配并接受行的保留文本。
+ J- ?3 S. y* a usebackq - 指定新语法已在下类情况中使用: - W+ ~, w' z! t
在作为命令执行一个后引号的字符串并且一个单 t8 K6 P, d) f: S4 ?2 N
引号字符为文字字符串命令并允许在 filenameset
! U2 z- X" N; |" }) o 中使用双引号扩起文件名称。1 N4 d/ V9 v- w( d1 G. H
' S8 s8 q* K; e$ [4 t 某些范例可能有助:8 J, j: G' Z: E/ K
. D& W& G" l* @+ l5 BFOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k: h8 D/ U! e9 j- g2 R/ ?: L
# X; V9 P) H! u9 t) j$ _ 会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将1 j( U2 j4 R( w7 X# o3 Q
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
2 y$ ~/ [( K9 p) x1 s/ q+ c5 ^ 空格定界符号。请注意,这个 for 程序体的语句引用 %i 来% @ ]( h% w; l& g3 u; l
取得第二个符号,引用 %j 来取得第三个符号,引用 %k+ g; k0 s* ?* a: l" _, O: {
来取得第三个符号后的所有剩余符号。对于带有空格的文件
% _/ M+ Z7 e Z1 D 名,您需要用双引号将文件名括起来。为了用这种方式来使
$ c5 K0 o% V* d0 w+ h 用双引号,您还需要使用 usebackq 选项,否则,双引号会
3 s- U8 n! N* P3 r. Q% Q3 w 被理解成是用作定义某个要分析的字符串的。8 ~* n& c0 A+ b- Z
. R" B9 I: \; I9 k
%i 专门在 for 语句中得到说明,%j 和 %k 是通过4 k$ B3 c5 \: c
tokens= 选项专门得到说明的。您可以通过 tokens= 一行# ]7 s7 [: C4 n# k" D. J# z
指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
9 @+ F k* Z8 k* L5 d 'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
: d: [' E; J- u1 S5 }/ G7 _3 Y, `. @ 同时不能有 52 个以上都在使用中。5 K- U% T6 }* o
$ H) K u# F i: A7 F
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
' h) @1 W% C! J/ z9 [& ?+ j. B 用单引号将括号之间的 filenameset 括起来。这样,该字符- h% l3 F3 R5 B# Y5 G
串会被当作一个文件中的一个单一输入行。* D" z! a) z# `" i7 _4 x6 z/ q4 H
4 e1 B: B; p+ }5 n, Z# _( Y
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
: |3 V5 G. M0 h 括号之间的 filenameset 变成一个反括字符串。该字符串会
i+ r5 Y U$ }: l" v; T4 |! E. ] 被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进' r9 e E" u3 t6 ~, ]( M
内存,并被当作文件分析。因此,以下例子:
. }: r `/ e% U
& q' ~& {( ?: v9 [- ^ FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i, f8 L* t- h' y# z6 G: p1 k8 P
0 y7 N5 ?) _. [5 `" g" i2 I q 会枚举当前环境中的环境变量名称。
" \. ` o% F* v- C
0 z+ c8 \3 h0 l- @( ^5 B另外,FOR 变量参照的替换已被增强。您现在可以使用下列
* H4 C& E7 R/ Q8 u9 C( ^1 ?选项语法:' F( l7 k! f2 R" ~7 z# |, p. {& \
, z8 n/ K% h- R+ b
~I - 删除任何引号("),扩充 %I
- T' ]$ [1 ]2 i %~fI - 将 %I 扩充到一个完全合格的路径名6 `# @5 S9 [, ~8 p& E0 _6 w5 m' t1 F4 E
%~dI - 仅将 %I 扩充到一个驱动器号
# f2 {: ]* Q G) c %~pI - 仅将 %I 扩充到一个路径1 e& M2 B4 D$ u
%~nI - 仅将 %I 扩充到一个文件名
& ] w( a( X+ }4 K4 }3 S %~xI - 仅将 %I 扩充到一个文件扩展名$ ^+ z& K9 L% H6 p) _
%~sI - 扩充的路径只含有短名
8 K) F2 X# g3 X q %~aI - 将 %I 扩充到文件的文件属性
; o& A' w& a- Q2 ] %~tI - 将 %I 扩充到文件的日期/时间( V6 Y4 ^0 v6 v
%~zI - 将 %I 扩充到文件的大小# w$ `6 L) O7 W4 O( c6 e# R2 s
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充& h5 M& } e3 M1 Z/ e! P
到找到的第一个完全合格的名称。如果环境变量名& j* V8 @: ?# i3 W$ X
未被定义,或者没有找到文件,此组合键会扩充到
' A4 U# r, B+ k0 Q6 t& H3 ? 空字符串$ s. _7 ?" C, n, v7 ~
+ `6 M& k3 v( w9 `; c% |可以组合修饰符来得到多重结果:
; `2 y# L+ D2 V
6 L. x, ?5 {3 }0 G9 K. Q3 t %~dpI - 仅将 %I 扩充到一个驱动器号和路径
, r/ V3 Y W' J/ ^4 U: @ %~nxI - 仅将 %I 扩充到一个文件名和扩展名
: X" Y' n+ c9 ~7 @( i7 b ?& }3 s %~fsI - 仅将 %I 扩充到一个带有短名的完整路径名 G' h/ h$ c5 z6 I/ L
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
+ @- M# G6 `! u/ Y2 T) k* p: {1 [ 到找到的第一个驱动器号和路径。
- l, d- }! {) f% [+ d! f5 n %~ftzaI - 将 %I 扩充到类似输出线路的 DIR$ ~6 r1 u( g! l& q; B/ u# W
% L" C4 w1 l# l( H5 I4 v在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法1 G7 h: [* S; G3 H# V4 O/ \
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
7 n0 h2 B7 c6 [比较易读,而且避免与不分大小写的组合键混淆。: `4 L9 Y% L7 c2 o! `
t- y3 c- ?1 l- n; t) P- z& \7 \4 `+ z5 R' k' r3 f
---------------------------------------
( [5 {/ W- F) A. V2 ^, v* P( }转自 http://www.cnblogs.com/tanzhiwei/% D. c& f1 M7 v7 x3 Z: h) E
% J3 z$ l( A8 B9 C( d; Q' w[ 本帖最后由 深情少年 于 2008-11-28 15:09 编辑 ] |
评分
-
1
查看全部评分
-
|