1. 程式人生 > >淺談批處理for命令中的變數擴充套件

淺談批處理for命令中的變數擴充套件

三、帶引數 /f 的for(這裡的引數/F可以理解為“file”的意思,程式碼處理物件為文字串)


::例一:
程式碼:
for /f "skip=1 tokens=1,2* delims= " %%a in (a.txt) do echo %%a %%b %%c
pause

先從引號內的東西講起,很多新手對這些難以理解,因為 for /? 翻譯的簡直是一塌糊塗.

skip=
tokens=
delims=

這三項是用的最多的,根據需要.可以不用,可以一起使用,也可以只使用一個或兩個. 但是不管使用幾個都要用引號將它們擴起來.當然不使用時,自然就不需要引號了.

skip=
for迴圈文字內容是以行為單位,從上至下進行的,skip=1意識就是跳過文字的第一行,即不迴圈第一行, 那麼skip=2 自然就是跳過前兩行了,依次類推.........

delims=
先講這句
delims=後面的字元的意識是,將文字每一行的內容以delims=後面的字元分割成若干列.

假設a.txt某一行的內容是 111,222.333 444/555
我們用下面的語句
::例二:
程式碼:
for /f "tokens=1-5 delims=,./ " %%a in (a.txt) do echo %%a %%b %%c %%d %%e
pause
顯示結果是 111 222 333 444 555

解釋:
  意識就是把111,222.333 444/555以,./和空格(不分先後)分成了5列.注意程式碼中/和"後面有個空格,
  使用中要注意空格要放到最後,如"delims=,. /" 這樣就不行了.

那如果我們不使用逗號來分割會如何呢?如: "delims=./ "那麼就會分割成111,222 333 444 555
看出區別了嗎?delims=後面可以是多個字元,可以是空格,也可以什麼都沒有. 什麼都沒有代表什麼呢?就是不以任何東西為分割符,也是整行的內容了. 因為for預設是以,;和空格作分割符的, 所以一般要取得整行內容通常會用"delims="這樣的形式來取消for的預設分割符.

tokens=
tokens=1-5
1-5很好理解就1至5,前面我們用delims=後面的字元為分割符,將文字內容分成了多列,那麼你需要的是哪些列呢?
用tokens=可以很好幫你提取到.
還是以例二為例:
通過dilims=,./  將文字分成了111 222 333 444 555 五列.
注意程式碼中前面有個%%a 這裡的%%a就是代表第一列,第二列就是%%b,第三列就是%%c 依此類推.....
那麼我們如果把echo %%a %%b %%c %%d %%e 改為 echo %%e %%d %%c %%b %%a 會如何呢?
當然.會顯示 555 444 333 222 111

如果是:echo %%b %%d 又會顯示什麼呢?  不用我說了吧!
若是第一個%%a把它改為%%i也是一樣,那麼第二列就是%%j...%%k...依此類推....
明白了?就是按英文字母的順序依此類推的.

這裡我們用的是tokens=1-5但是在例一中,我們用的是tokens=1,2* 有什麼區別呢?
其實差不多-號代表從幾至幾而逗號代表單一的,如 tokens=1,5就是代表第一列和第五列,而不是1至5列.
*號代表剩下的所有的列.如:tokens=1,2*代表%%a為第一列,%%b為第二列,%%c代表後面所有的列.
for /f 不但可以迴圈文字內容還可以迴圈字元竄,如:
::例三:
程式碼:
for /f "tokens=1-3 delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c
pause
只要將()裡的字串用引號擴起來,for就會把它當字串來迴圈,而不是文字.

四、for的 /D 和/R 引數(這兩個引數個人比較少用)

1>/D引數(常用來查詢當前目錄或者指定目錄的下的資料夾)
基本用法:FOR /D %variable IN (set) DO command [command-parameters]
如:查詢F盤根目錄下的資料夾 (不包括檔案)
程式碼:
@echo off
for /d %%i in (f:\*) do echo %%i
pause>nul

如果省略 括號中的 "f:\",則會直接查詢批處理所在目錄的資料夾
假設本批處理檔案儲存在:F:\test下
執行以下批處理程式碼,將會查詢 F:\test下的資料夾
程式碼:
@echo off
for /d %%i in (*) do echo %%i
pause>nul

2> /r引數
基本用法:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹中,所有符合(set)的檔案或者資料夾。如果在 /R 後沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字元,則列舉該目錄樹。
用法示例:
列舉F:盤下所有的 檔案
程式碼:
@echo off
for /r f:\ %%i in (*) do echo %%i
pause>nul

列舉F:盤下所有的 .bat檔案(包括子目錄),則:
程式碼:
@echo off
for /r f:\ %%i in (*.bat) do echo %%i
pause>nul

如果省略以上程式碼中的F:\,則會列舉當前目錄 所有符合(set)的檔案
如:列舉批處理所在目錄的所有批處理檔案(包括子目錄)
程式碼:
@echo off
for /r %%i in (*.bat) do echo %%i
pause>nul