BAT語句結構ide
相似於C語言,批處理也有它的語句結構。批處理的語句結構主要有選擇結構(if語句)、循環結構(for語句)等。 spa
if語句(選擇結構)token
if語句實現條件判斷,包括字符串比較、存在判斷、定義判斷等。經過條件判斷,if語句便可以實現選擇功能。 ip
一、字符串比較 內存
if語句僅可以對兩個字符(串)是否相同、前後順序進行判斷等。其命令格式爲: ci
IF [not] string1 compare-op string2 command1 [else command2] 文檔
其中,比較操做符compare-op有如下幾類: 字符串
== - 等於 string
EQU - 等於 it
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於
選擇開關/i則不區分字符串大小寫;選擇not項,則對判斷結果進行邏輯非。
字符串比較示例:
===============================================
@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)
if /i %str1% LSS %str2% (echo str1^<str2) else (echo str1^>=str2)
echo.
set /p choice=是否顯示當前時間?(y/n)
if /i not %choice% EQU n echo 當前時間是:%date% %time%
pause>nul
===============================================
對於最後一個if判斷,當咱們輸入n或N時的效果是同樣的,都不會顯示時間。若是咱們取消開關/i,則輸入N時,依舊會顯示時間。
另外請注意一下幾個細節:1-echo str1^<str2和echo str1^>=str2;2-echo.。
二、存在判斷
存在判斷的功能是判斷文件或文件夾是否存在。其命令格式爲:
IF [NOT] EXIST filename command1 [else command2]
===============================================
@echo off
if exist %0 echo 文件%0是存在的!
if not exist %~df0 (
echo 文件夾%~df0不存在!
) else echo 文件夾%~df0存在!
pause>nul
===============================================
這裏注意幾個地方:
1-存在判斷既能夠判斷文件也能夠判斷文件夾;
2-%0即表明該批處理的全稱(包括驅動器盤符、路徑、文件名和擴展類型);
3-%~df0是對%0的修正,只保留了其驅動器盤符和路徑,詳情請參考for /?,屬高級批處理範疇;
4-注意if語句的多行書寫,多行書寫要求command1的左括號必須和if在同一行、else必須和command1的右括號同行、command2的左括號必須與else同行、command1和command2均可以有任意多行,即command能夠是命令集。
三、定義判斷
定義判斷的功能是判斷變量是否存在,便是否已被定義。其命令格式爲:
IF [not] DEFINED variable command1 [else command2]
存在判斷舉例:
===============================================
@echo off
set var=111
if defined var (echo var=%var%) else echo var還沒有定義!
set var=
if defined var (echo var=%var%) else echo var還沒有定義!
pause>nul
===============================================
對比可知,"set var="能夠取消變量,收回變量所佔據的內存空間。
for語句(循環結構)
for語句能夠實現相似於C語言裏面的循環結構,固然for語句的功能要更強大一點,經過不一樣的開關能夠實現更多的功能。for語句有多個開關,不一樣開關將會實現不一樣的功能。
一、無開關
無開關的for語句可以對設定的範圍內進行循環,是最基本的for循環語句。其命令格式爲:
FOR %%variable IN (set) DO command
其中,%%variable是批處理程序裏面的書寫格式,在DOS中書寫爲%variable,即只有一個百分號(%);set就是須要咱們設定的循環範圍,相似於C語言裏面的循環變量;do後面的command就是循環所執行的命令,即循環體。
無開關for語句舉例:
===============================================
@echo off
for %%i in (a,"b c",d) do echo %%i
pause>nul
===============================================
二、開關/L
含開關/L的for語句,能夠根據set裏面的設置進行循環,從而實現對循環次數的直接控制。其命令格式爲:
FOR /L %%variable IN (start,step,end) DO command
其中,start爲開始計數的初始值,step爲每次遞增的值,end爲結束值。當end小於start時,step須要設置爲負數。
含開關/L的for語句舉例(建立5個文件夾):
===============================================
@echo off
for /l %%i in (1,2,10) do md %%i
pause
===============================================
上例將新建5個文件夾,文件夾名稱依次爲一、三、五、七、9。能夠發現,%%i的結束值並不是end的值10,而是不大於end的一個數。
三、開關/F
含開關/F的for語句具備最強大的功能,它可以對字符串進行操做,也可以對命令的返回值進行操做,還能夠訪問硬盤上的ASCII碼文件,好比txt文檔等。其命令格式爲:
FOR /F ["options"] %%variable IN (set) DO command
其中,set爲("string"、'command'、file-set)中的一個;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一個或多個的組合。各選項的意義參見for /f。通常狀況下,使用較多的是skip、tokens、delims三個選項。
含開關/F的for語句舉例:
===============================================
@echo off
echo **No Options:
for /f %%a in ("1,2,10") do echo a=%%a
echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c
pause
===============================================
@echo off
echo 本文件夾裏面的文件有:
for /f "skip=5 tokens=3* delims= " %%a in ('dir') do (
if not "%%a"=="<DIR>" if not "%%b"=="字節" if not "%%b"=="可用字節" echo %%b
)
pause
===============================================
@echo off
echo 本文件夾裏面的文件有:
dir>c:\file.txt
for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (
if not "%%a"=="<DIR>" if not "%%b"=="字節" if not "%%b"=="可用字節" echo %%b
)
del c:\file.txt
pause
===============================================
對於後面的兩個例子,其中options裏面的delims= 是能夠刪除的,由於只要添加了/F開關係統就將delims的值默認爲空格。
符號字符串中的最後一個字符星號,
那麼額外的變量將在最後一個符號解析以後
分配並接受行的保留文本。本例中也能夠改成4,不過文件名中有空格的文件,只能顯示空格之前部分
同時咱們也看到了,for語句的do後面的command也是能夠分行的,只須要保證command的左括號和do在同一行就能夠了。
四、開關/D或/R
含開關/D或/R的for語句是與目錄或文件有關的命令,通常狀況下不多使用。含開關/R的命令有時候被用於經過遍歷文件夾來查找某一個文件或文件夾,故而列舉此例。
含開關/R的for語句舉例(文件夾遍歷):
===============================================
@echo off
setlocal enabledelayedexpansion
FOR /R d: %%i IN (.) DO (
set dd=%%i
set "dd=!dd:~0,-1!"
echo !dd!
)
pause
exit
===============================================
上例便可以羅列出D盤下的全部文件夾,其速度要比命令"tree d:"慢多了,不過其返回結果的實用性則遠遠超過了tree命令。
通常狀況下咱們不推薦經過遍歷文件夾來查找文件,特別是在查找某些程序(好比QQ.exe)的位置時。推薦經過reg命令查找註冊表來查找QQ的路徑,以保證查找效率。
上例中也出現了幾個新面孔,如setlocal、感嘆號等。其中,感嘆號其實就是變量百分號(%)的強化版。之因此要用!而不用%,是由於在for循環中,當一個變量被屢次賦值時,%dd%所獲取的僅僅是dd第一次被賦予的值;要想刷新dd的值,就必須首先經過命令"setlocal enabledelayedexpansion"來開啓延遲變量開關,而後用!dd!來獲取dd的值。
for語句是批處理裏面功能最強大、使用最廣泛卻又最難掌握的一套命令,這也是批處理菜鳥和批處理高手最明顯的一個分水嶺,一旦掌握了這套命令,那麼你就離批處理達人不遠了!