控制結(jié)構(gòu)
?
1.??????
如何定義行號?
??????
可以定義任意長度的
label
并且中間允許有空格,但是
MS-DOS
只區(qū)分其中的前
8
個字符,以冒號開頭的腳本文件行不被處理。
行號同樣不區(qū)分大小寫。行號的冒號前面可以有空白符號。
?
2.??????
如何使用
GOTO
語句?
<label>
一般為所定義的行號,如果命令擴(kuò)展被允許(
default
)也可以用命令跳轉(zhuǎn)到文件末尾:
????????????? :EOF
不區(qū)分大小寫
?????????????
如果命令找不到需要跳轉(zhuǎn)的行好位置,則顯示:
3.??????
如何使用
For
循環(huán)語句?
FOR {%<var>|%%<var>} IN (<set>) DO <command>
FOR
語句可以在命令行和腳本文件中使用,在腳本文件中使用,變量定義和引用用
%%
;在命令行中使用,變量定義和引用用
%
。變量名是大小寫敏感的,并且可以用除了
0
到
9
任意的單個字符(不包含元符號),這點(diǎn)比較特殊。
DO
后面是需要執(zhí)行的語句,
循環(huán)變量的定義域在
DO
子句中。
?
<set>
有多種形式考慮:
l??????
可以是字符串的集合,中間用空白符分割:
?
<string> <string> <string>
l??????
可以是通配符展開的
文件名或路徑名
另外文件名還可以是特殊的字符
,
當(dāng)前目錄
(.)
和上級目錄(
..
)
這些內(nèi)容之間可以通過分隔符分開,分隔符是空白、分號、逗號、雙引號,注意引號本身會傳遞到循環(huán)變量中去,
而分號和逗號則不會,另外如果其他三種分隔符出現(xiàn)在雙引號中,他們會被傳遞到循環(huán)變量中去。
?
可以對不同種類的
<set>
值進(jìn)行遍歷:
l??????
對字符串遍歷
FOR %%<var> IN (<string-set>) DO <command>
l??????
對文件進(jìn)行遍歷
FOR %%<var> IN (<file-path-name-wildcard>) DO <command>
?????????????
下面的命令需要命令擴(kuò)展打開
l??????
對目錄進(jìn)行遍歷
FOR /D %%<var> IN (<dir-path-name-wildcard>) DO <command>
?
l??????
遞歸遍歷文件樹
FOR /R [[<driver>:]<path>] %%<var> IN (<set>) DO <command>
?????????????
如果沒有目錄指定,則默認(rèn)從當(dāng)前目錄開始。
l??????
進(jìn)行步長型循環(huán)
FOR /L %%<var> IN? (<start> <step> <end>) DO <command>
其中
<start> <step> <end>
是整數(shù)(其他數(shù)會取整),無法解釋的字符串認(rèn)為是
0
,可以遞增或遞減。
l??????
文件遍歷和解析
FOR /F ["<parsing-keywords>"] %%<var> IN (<set>) DO <command>
其中
<parsing-keywords>
的形式(大小寫不敏感)如下:
?????? eof=<c>?????? #<c>
是一個字符的行結(jié)束符,默認(rèn)是
newline
字符,行結(jié)束符后面認(rèn)為是注釋
?????? skip=<N>?????? #<N>
是從行首跳過的行數(shù),默認(rèn)是
0
delims=<xxx>?? #<xxx>
是記錄字段的分隔符集,默認(rèn)是空格和
<tab>
,覆蓋默認(rèn)會提取空白
tokens=[{<X>,|<M>-<N>,}…][*]? #
指定提取的記錄字段,默認(rèn)是
1
,最后的
*
代表剩余字段
??????????????????????????????????????????????????????? #
剩余字段不會去除分隔符,但是去除注釋
usebackq??????? #
使用
back quotation
作為命令的引用符(見
<set>
的格式),默認(rèn)是不使用
?
如果不使用
usebackq
選項(xiàng),
<set>
的形式:
<file-set>???????????????????? #no quotation
“<literal-string>”?? #double quotation
‘<command>’????? #single quotation
如果使用
useback
選項(xiàng),
<set>
的形式:
?
“<file-set>”????????? # double quotation
‘<literal-string>’???? #single quotation
`<command>`????? #back quotation
?
關(guān)于隱含變量,只需指定首個變量的字母,其它按順序依次排列,最多可以定義
26
個變量。(大小寫敏感)
?
?
?
FOR
語句中的變量名同樣可以展開為:
%%~[{f|d|a|z|s|n|x|t|p}][$<var>:]<c>
?
4.??????
IF
條件語句的語法格式為:
????? IF [NOT] <condition> <command> [ELSE <command>]
??????
其中
NOT
表示條件真值去反。
??????
??????
利用不同的
<condition>,
我們可以判斷
l??????
ERROR-LEVEL:
等于或大于
<n>
的錯誤發(fā)生時(shí)為真
l??????
字符串相等
字符串相等,不需要用引號環(huán)繞
l??????
文件存在
下面需要命令擴(kuò)展打開
l??????
字符串比較
[/I] <string> <comparator> <string>
/I
選項(xiàng)打開則比較是
case-insensitive,
如果都是數(shù)字作比較,則轉(zhuǎn)為用數(shù)值比較,只能比較整數(shù),比較浮點(diǎn)數(shù)則采用字符串比較法。
?
比較操作符
(
大小寫不敏感
)
包括:
EQU (
等于
)
、
LSS (
小于
)
、
GTR (
大于
)
、
GEQ(
大于等于
)
、
LEQ(
小于等于
)
、
NEQ(
不等)
l??????
命令行擴(kuò)展版本
?????????????
當(dāng)命令擴(kuò)展版本號大于或等于
<n>
時(shí)為真,該值最低版本為
1
l??????
變量定義
?????????????
如果變量的定義存在則為真
?????????????
則自動增加一下變量定義
-?????????
%ERRORLEVEL%
定義為當(dāng)前的即上次命令行執(zhí)行產(chǎn)生的
errorlevel
(一定有定義)
-?????????
%CMDCMDLINE%
定義為上次傳遞給命令解釋器
(cmd.exe)
的未經(jīng)處理的原始命令行。
(如果
%CMDCMDLINE%
未被定義,否則不影響原始值)
-?????????
%CMDEXTVERSION%
定義為當(dāng)前命令擴(kuò)展的版本號(如果
% CMDEXTVERSION %
未被定義,否則不影響原始值)
?
如果使用
ELSE
語句應(yīng)當(dāng)用以下形式,因?yàn)楸仨氂脧?fù)合語句或
newline
來結(jié)束
<command>:
IF [NOT] <condition> (
????? <command>
) ELSE IF (
????? <command>
) ELSE (
????? <command>
)
或者:
IF [NOT] <condition> (<command>) ELSE (<command>)
?
5.??????
CHOICE
選項(xiàng)分支命令,格式如下:
CHOICE [/c [<choices>]] [/n] [/cs] [/t <timeout> /d <default>] [/m <msg>]
其中
/c
選項(xiàng)指定用戶的選擇鍵,默認(rèn)是
yn
,其顯示為:
?????? /cs
指定大小寫敏感選擇,默認(rèn)不敏感,如果不敏感則提示選擇鍵都采用大寫字符。
?????? /n
隱藏鍵提示信息。
?????? /t
指定超時(shí)時(shí)間
(second)
,根據(jù)版本不同可能會顯示遞減的計(jì)時(shí)數(shù)字,默認(rèn)不超時(shí)。
?????? /d
超時(shí)后的默認(rèn)選項(xiàng)。
?????? /m
指定提示信息,顯示在選擇鍵提示前面。
注意,該命令不是所有的命令解釋器都支持。
該命令返回用戶選擇鍵的序號
(
從
1
開始
)
作為
errorlevel
的值
,
可由
IF
語句判斷。
?
6.??????
如何定義組合語句
?
在上述控制語句中,如
DO
、
IF/ELSE
結(jié)構(gòu)中,經(jīng)常會嵌入一段代碼,由幾條語句構(gòu)成,這時(shí)候需要定義組合語句,甚至在有些結(jié)構(gòu)中,例如
IF/ELSE
,即使只有一條語句也寫成組合語句的形式。組合語句定義如下:
??????
特別是
<command-lines>
為空,即可以定義空語句。
??????
多個命令在一行時(shí)需要用
&
來分隔。