batch入門教程(3)

邏輯判斷

邏輯判斷(Logical Judgement),是指使用if指令或者其它判斷指令進行判斷並控制流程進行的一種方式,它是程序的重要組成部分。在Batch中,我們大部分時間都會選擇使用if,此外還有邏輯判斷符號||和&&存在。

if

if 可以判斷變量與值、變量與變量、值與值的關係,基本語法如下:

其中,if語句所使用的代碼塊需要使用()括起來,而不是像其它語言那樣的{}。另外,Batch內沒有else if的用法,因此,如果您想要使用else if,那麼您可能需要這樣寫:

也就是說,您必須在else後的代碼塊裏寫if而不是直接緊跟在後面寫if。

當您初次看見這個判斷語法時,可能認爲很荒謬。爲什麼沒有括號?就像其它語言那樣:

這是Batch的個性。如果您先前對if語句沒有絲毫的瞭解,可以看一下下面這個奇妙的公式:

例如,我們要判斷1是否等於2,我們就可以這樣寫:

其中else語句可要可不要,如果不需要,則會出現兩種寫法:

如果您是縮進愛好者,可以選擇前者。後者可以讓您的代碼在單行中看起來更簡潔,但是後者不能用else。

if not

與其它語言相似,Batch也有判斷非的方式,只不過並不是用的!=而是更直接了當的if not,它的用法與if沒有區別,只是對結果取反而已。

if / not defined

if not defined和if defined用於測試一個變量是否被定義,if not defined的成立條件是沒有定義,if defined的成立條件是已經定義。在if not defined ()後面加上else就相當於是if defined了,原理很好理解。

用法:

實例:

if defined則相反。

當然,我們也可以用if來實現if not defined的效果:

也就是說if "%變量名%"==""相當於if not defined變量名。但是大多數情況下,我們建議選取後者使用,因爲這樣更加規範,前者不知道會不會有Bug。

if / not exist

if exist和if not exist也是相反的一對判斷。它們判斷某文件是否存在。用法:

它們也可以使用else。

if 的數字判斷

與set一樣,if也有專用於數字的用法。我們可以比大小。以下是一個簡單的比較大小程序:

用if比較大小的關鍵在於中間的符號。我們判斷兩個值相等可以使用==,但是必須需要前後兩者加上引號。而我們可以直接使用表達數學關係的字母簡稱來代表數字之間的關係(其它的,諸如字符之類的,不能用,只能用==)。

以下是Batch中判斷數字關係的字母簡稱:

我們就可以用非負性原理來判斷數值之間的關係:

if %ERRORLEVEL%

%ERRORLEVEL%是一個環境變量,它在不同的指令執行後會有不同的值。以下列出一些特殊情況的%ERRORLEVEL%值。

注意:ERRORLEVEL是一個非常奇妙的東西,在有些時候它甚至可以等於任何值,沒人知道它到底能等於多少。上表列出來的只是一些常見的、較爲穩定的錯誤代碼。ERRORLEVEL一般不會等於32。

如果我們要判斷ERRORLEVEL,我們直接使用數學判斷語句即可:

我們可以使用前面提到過的exit /b和if %ERRORLEVEL%來完成程序之間的傳參工作,這將在“調用與參數”中講到。

邏輯判斷符

Batch的邏輯判斷符(Logical Judge)分爲兩種:||與&&,它們並不是如三元運算符(Ternary Operator)一樣發揮着if else的作用,而是用來判斷指令是否執行成功。

它的用法是直接接在需要判斷的指令後面:

||代表,若前面的指令不成功,則執行後面的指令,&&相反,若前面的執行成功,則執行後面的指令。它們可以連用,但是如果混用着連用,很容易產生奇怪的Bug,因此筆者不建議連用。

我們可以使用邏輯判斷符完成很多工作,例如,我們判斷用戶的輸入是否爲數字,來提前避免處理過程中出現不必要的問題。

如果a不是數字,@set /a c=b+1a就會出現問題,於是就會被||檢測到,隨即執行後面的指令。不過,爲什麼不寫成set /a c=b+a呢?因爲如果單純地將一個非數字的變量寫入表達式中,會被直接看作是0,當再加上一個數字的時候,就相當於想要把1a這個數字字母組合看成數字,這是不可能的,於是自然會失敗。

至於爲什麼要添加@,這是爲了避免回顯的失敗信息。因爲一個指令執行失敗後必定會有失敗信息,而我們正是在取代失敗信息,因此我們不需要系統的失敗信息。當然如果您需要可以把@去掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章