(做者:sanqima )spa
例如,刪除「C:\Documents and Settings\Administrator\桌面\T1\txt\批處理實驗\unit1」裏的a.txt文件,使用if的代碼以下:.net
@echo off if exist "C:\Documents and Settings\Administrator\桌面\T1\txt\批處理實驗\unit1\a.txt" ( echo file is find! del "C:\Documents and Settings\Administrator\桌面\T1\txt\批處理實驗\unit1\a.txt" ) else ( echo file is not found! ) pause>nul
將上述代碼保存爲if_del.bat,效果以下:命令行
2.if——條件判斷(分支)語句
「if」語句是批處理中的條件分支語句,表示的意思就是「若是...則...不然...」,大多用在批處理程序中的條件處理部分。「if」語句在批處理中使用的是比較普遍的,例如要查看某個文件,則首先要肯定該文件存在才能夠查看,不然MS-DOS會拋出錯誤信息,這個時候就可使用「if」語句進行判斷。「if」命令語句是經過條件成立與否來決定語句的執行,這裏的條件成立和條件不成立能夠理解爲「true」和「false」,可是批處理中不存在這兩個常量。「if」語句所表達的意思是隻有當條件成立時纔會執行指定的命令語句,主要有如下幾種用法。
1.判斷信息是否相等(「==」)
「if」命令語句就是用於條件的判斷,然而因爲批處理腳本自己比較弱化,因此初始的MS-DOS只能支持信息相等的比較,也就是隻支持「==」操做符。用於比較字符串與字符串、變量與變量、變量與字符串之間是否相等,若是相等則表示條件成立。用法以下:
if [not] 信息比較表達式 (
命令行1
) else (
命令行2
)
這裏的「信息比較表達式」的格式爲「字符串1==字符串2」或「變量1==變量2」或「變量==字符串」的形式,也便是說只能使用「==」進行字符串或變量之間的比較,上面的「not」表示相反操做,不作多的解釋,來看下面的例子:code
@echo off if abc==ABC ( echo abc euqal ABC ) else ( echo abc not euqal ABC ) pause>nul
保存爲批處理文件,執行既能夠看到效果,能夠自行修改,添加「not」試試。
2.判斷錯誤級別信息
錯誤級別「errorlevel」是MS-DOS的內置環境變量,在上面已經介紹過,主要用於保存上一條命令語句是否執行成功,成功則返回0,失敗或錯誤則返回相對應的錯誤級別碼。然而「errorlevel」是內置環境變量,因此可使用下面的方式判斷:blog
@echo off if %errorlevel%==0 ( echo success! ) else ( echo failed! ) pause>nul
然而「if」語句提供了一種特殊的錯誤級別判斷方式,以下:字符串
if [not] errorlevel number (
命令行1
) else (
命令行2
)
這種方式並非使用變量的方式進行引用,而是做爲關鍵字使用,「number」表示一個錯誤級別碼,「not」表示相反操做,不作多的解釋。使用這種方式比較簡潔。
3.判斷文件是否存在
在上面已經提到關於文件是否存在的判斷,「if」語句提供了一種特殊的文件判斷方案,用法以下:
if [not] exist filepath (
命令行1
) else (
命令行2
)
其中「exist」是關鍵字表示「存在」,「filepath」表示要判斷的文件路徑,若是檢查到指定的文件存在則執行對應的命令塊,「not」表示相反操做,不作多的解釋。多說無益,直接看例子:cmd
@echo off if exist C:\a.txt ( echo file is find! del C:\a.txt ) else ( echo file is not found! ) pause>nul
上面的例子表示若是檢查到C盤存在「a.txt」文件則刪除該文件,保存爲批處理文件試試便可。it
4.判斷MS-DOS擴展版本號(擴展用法)
MS-DOS擴展版本號「cmdextversion」是MS-DOS的內置環境變量,在上面已經介紹過,當在使用某個新擴展特徵時能夠首先判斷版本號是否對應,不過該用法須要在啓用命令擴展以後才能使用,而命令擴展默認是啓用的,進行擴展版本號判斷是「if」語句的擴展用法。用法以下:
if cmdextversion number (
命令行1
) else (
命令行2
)
意思是說噹噹前批處理擴展版本號與給定的「number」值對應時執行「語句1」不然執行「語句2」,大多數狀況下不會使用這個命令語句。
5.判斷變量是否存在(擴展用法)
變量是否存在的檢查是「if」語句的擴展用法,用法比較廣,能夠判斷變量是否被聲明,而後在斟酌使用,不過該用法須要在啓用命令擴展以後才能使用,而命令擴展默認是啓用的,用法比較相似文件是否存在的判斷用法,以下:
if defined 變量名 (
命令行1
) else (
命令行2
)
當變量被聲明定義後「defined 變量名」纔會成立,不然不會成立,具體實例能夠自行編寫。
6.信息比較運算(擴展用法)
上面介紹過「if」默認狀況下只支持相等比較運算,而後後續考慮則對「if」語句進行了命令擴展,使其能夠支持多種比較運算操做,不過該用法須要在啓用命令擴展以後才能使用,而命令擴展默認是啓用的。用法與「if」相等比較運算的用法一致,以下:
if [/i] 操做數1 比較運算符 操做數2 (
命令行1
) else (
命令行2
)
其中操做數能夠是字符串也能夠是數值,同時還能夠是變量;「/I」選項用於開啓比較過程當中字符串大小寫忽略功能;在命令擴展下支持的比較運算符有:「equ(等於)」、「neq(不等於)」、「lss(小於)」、「leq(小於等於)」、「gtr(大於)」、「geq(大於等於)」六種,其中「lss」、「leq」、「gtr」和「geq」四種比較操做符主要用於對數值進行比較,當參與比較的字符串是字符串時,將被轉換爲對於的ASCII碼進行比較;而「equ」和「neq」既能夠比較數值也能夠比較字符串。來看下面的例子: io
@echo off set var1=123 set var2=abc set var3=12 if /i %var2% equ ABC ( if %var1% geq %var3% ( echo %var1%^>=%var3% ) else ( echo %var1%^<%var3% ) ) else ( echo %var2%不等於ABC ) pause>nul
上面的例子能夠說明「/I」的用法,以及其餘命令擴展下的操做符用法,保存爲批處理文件便可執行查看效果。class
綜上所述,特別提示以上的「if」語句中的「else」子句是可省略的,「else」只是起到多分支的做用,表示當條件不成立時執行的處理過程,沒必要要時能夠去掉。關於「()」表示範圍,用於表示多條語句執行的語句塊(批處理中的每一條語句都是以換行符做爲結束符號的),也就是說當條件成立是會執行「if」後「()」內的全部語句,當只有一條語句須要執行時能夠省略「()」,特別須要注意的是省略「()」時,命令和「if」語句必須寫在一行,當有「else」子句時必須使用「()」。【小提示:注意「()」與關鍵字之間的空格】
3.setlocal/endlocal——啓動/結束延遲環境變量擴展功能
前面已經介紹過變量的引用原理,就是查找變量名對應的值來替換「%變量名%」字符串,從而達到變量引用的效果,這個過程也稱之爲變量擴展過程,這種過程可用於處理基礎的普通的變量,然而咱們來看看下面的例子:
@echo off set var=before if "%var%" == "before" ( set var=after if "%var%" == "after" ( echo 重置var的值成功[var=%var%] ) else ( echo 重置var的值失敗[var=%var%] ) ) echo var=%var% pause>nul
按照正常的執行流程能夠推斷出結果爲「重置var的值成功[var=after]」,然而真實執行的結果並非咱們想象的,保存爲批處理文件並執行輸出的結果爲「重置var的值失敗[var=before]」。咱們來看看爲何爲出現這種狀況?首先聲明瞭變量var的值爲before,緊接着爲一個「if」語句,又在「if」語句中對變量var進行從新賦值,而後在進行判斷,然而該程序在解釋執行的過程當中,將「if」語句以及其內的「set」命令和「if」語句做爲一整條語句進行解釋的,當遇到「%var%」時會自動查找「var」的值替換當前語句,也就是整個外層「if」語句中的全部「%var%」字符串,所以內部的「if」判斷條件中的「%var%」被替換成了「before」,因此永遠都不會與「after」相等。這就是變量擴展的過程,那麼外層「if」語句中的「set var=after」是否執行了呢?答案是確定的,經過在程序末尾追加「echo var=%var%」能夠看出。
經過上面的例子,能夠得出一個結論就是批處理中的默認變量替換過程值針對一整條語句的,也就是說若是一整條語句中某個地方有變量的引用,則將會影響到該條語句中的全部變量引用,同一條語句中的全部變量引用會在同一時刻被替換爲該變量對應的值。通俗的說,就是默認狀況下,一條語句中的變量的值是固定的。
針對這個現象,批處理提出了延遲環境變量(簡稱延遲變量)的概念,主要用於對變量進行擴展,彌補普通變量的應用過程當中的不足,經過延遲環境變量能夠實如今一整條語句中改變變量的值。也就是說能夠經過延遲環境變量概念來實現子句內部的變量聲明、定義和賦值等操做。批處理中給出了「setlocal」和「endlocal」命令來實現延遲變量擴展功能的開啓和關閉操做,來看看兩個命令的用法:
setlocal enableExtensions | disableExtensions
setlocal enableDelayedExpansion | disableDelayedExpansion
endlocal
「setlocal」命令有兩種用法,第一種用法用於啓動(enableExtensions)或者停用(disableExtensions)命令處理器擴展名功能,這個用法主要用於管理MS-DOS解釋器的命令擴展功能,默認是開啓的,通常不多用到;第二種用法就是如今介紹的用於啓動(enableDelayedExpansion)或者停用(disableDelayedExpansion)延遲環境變量擴展功能,默認是停用的。「endlocal」命令用法比較簡單,就一個單一的命令行,該命令行主要用於停用延遲環境變量擴展功能,命令執行後將會還原當前批處理的擴展功能爲默認值,所作的環境變量的改動不在侷限於當前批處理文件;實質上「endlocal」比較特殊,是能夠省略的,也不是必定要與「setlocal」成對出現,當一個或多個「setlocal」沒有強制使用「endlocal」時會在批處理文件的末尾自動執行「endlocal」命令來還原初始默認設置。
當開啓延遲環境變量的擴展功能後,對環境變量的修改和引用將會擴展到整個批處理程序中。下面來看看如何使用延遲環境變量的擴展功能?如今使用延遲環境變量擴展功能解決上面遇到的問題,代碼以下:
@echo off setlocal enableDelayedExpansion set var=before if "!var!" == "before" ( set var=after if "!var!" == "after" ( echo 重置var的值成功[var=!var!] ) else ( echo 重置var的值失敗[var=!var!] ) ) pause>nul
在這段代碼中,首先使用「setlocal enableDelayedExpansion」語句啓用了延遲環境變量擴展功能,保存爲批處理文件並執行的結果則爲預想的效果「重置var的值成功[var=after]」,代碼中並無強制使用「endlocal」語句停用延遲環境變量擴展功能,可是MS-DOS解釋器會在程序的末尾,也就是「pause>nul」語句以後自動調用「endlocal」命令重置MS-DOS環境默認值。
可是上面的代碼與以前的代碼還有一處細小的區別,就是這裏使用了「!xxx!」的方式來引用變量。然而爲何要使用這種方式呢?「%xxx%」的方式是否可行?答案可想而知「%xxx%」的方式確定不可行。以前已經介紹過「%xxx%」方式的變量替換原則,當在一條命令的總體語句中時,若是首次遇到「%xxx%」的字符串,則會自動查找並替換該整條語句中的全部「%xxx%」字符串爲指定變量的值;正是這個緣由,因此提出了延遲環境變量擴展的概念,延遲環境變量擴展就是爲了解決整條語句中全部變量被替換的問題,然而在提出延遲環境變量擴展概念的同時擴展了「!xxx!」的變量引用方式,主要用於區別默認的「%xxx%」變量引用方式,並且「!xxx!」變量引用方式只能在延遲環境變量擴展功能開啓的環境中才能被解析。 來總結如下,關於延遲環境變量擴展的用法,延遲環境變量擴展功能主要用於解決像「if」、「for」以及各類複合語句(使用邏輯運算符拼接的語句)等中,用於在語句內部引用修改後的變量,由於默認狀況下語句中的變量是被提早替換的,使用延遲環境變量則能夠延遲替換過程到解析到該變量時;使用「setlocal enableDelayedExpansion」語句開啓延遲環境變量擴展功能後,只能使用「!xxx!」的方式引用變量,表示該變量將被做爲延遲環境變量進行處理,若是使用「%xxx%」方式引用將繼續做爲普通變量處理;開啓延遲環境變量擴展功能後能夠在必要的時候強制使用「endlocal」或「setlocal disableExtensions」語句停用該功能,默認在程序結尾自動調用「endlocal」語句進行重置。--------------------- (轉自:https://blog.csdn.net/sanqima/article/details/37818115 )