DOS之for循環用法說明


轉自:https://www.cnblogs.com/sll120/p/15066553.html

 

Windows bat腳本的for語句基本形態如下:

1
2
在cmd窗口中: for  %I in  (command1) do  command2
在批處理文件中: for  %%I in  (command1) do  command2

之所以要區分cmd窗口和批處理文件兩種環境,是因為在這兩種環境下,命令語句表現出來的行為雖然基本一樣,但是在細節上還是稍有不同,最明顯的一個差異就是:在cmd窗口中,for之后的形式變量I必須使用單百分號引用,即%I;而在批處理文件中,引用形式變量I必須使用雙百分號,即%%I。為了方便起見,若不是特別強調,以下的講解都以批處理文件環境為例。

我們先來看一下for語句的基本要素都有些什么:

  1. for、in、do 是for語句的關鍵字,它們三個缺一不可;
  2. %%I是for語句中對形式變量的引用,即使變量l在do后的語句中沒有參與語句的執行,也是必須出現的;
  3. in之后,do之前的括號不能省略;
  4. command1表示字符串或變量,command2表示字符串、變量或命令語句;

  下面來看一個Windows bat腳本的demo(記為demo1):

1
2
3
@ echo  off
for  %%I in  (ABC) do  echo  %%I
pause

  保存為.bat文件(批處理文件)並執行,將會在彈出的批處理窗口中看到這樣的信息:

  對批處理文件的for循環就是這樣簡單,下面來看看for語句的注意事項,並運行更復雜的for循環實例。

  • for語句的形式變量I,可以換成26個字母中的任意一個,這些字母會區分大小寫,也就是說,%%I和%%i會被認為不是同一個變量;形式變量I還可以換成其他的字符,但是,為了不與批處理中的%0~%9這10個形式變量發生沖突,請不要隨意把%%I替換為%%0~%%9中的任意一個;
  • in和do之間的command1表示的字符串或變量可以是一個,也可以是多個,每一個字符串或變量,我們稱之為一個元素,每個元素之間,用空格鍵、跳格鍵、逗號、分號或等號分隔;
  • for語句依次提取command1中的每一個元素,把它的值賦予形式變量I,帶到do后的command2中參與命令的執行;並且每次只提取一個元素,然后執行一次do后的命令語句,而無論這個元素是否被帶到command2中參與了command2的運行;當執行完一次do后的語句之后,再提取command1中的下一個元素,再執行一次command2,如此循環,直到command1中的所有元素都已經被提取完畢,該for語句才宣告執行結束。

有了以上的基礎,我們再來看下面這個例子,這個例子修改了demo1中的部分內容(記為demo2),結果將大不一樣:

1
2
3
@ echo  off
for  %%I in  (A,B,C) do  echo  %%I
pause

  運行結果如下:

如果把 bbs.bathome.cn 這個字符串中的點號換為空格、跳格或等號,執行結果將和demo2的執行結果別無二致。

現在,來分析一下demo2代碼中for語句的執行過程:

  1.for語句以逗號為分隔符,把 A,B,C 這個字符串切分成三個元素:A、B和C,由此決定了do后的語句將會被執行3次; 

  2.第一次執行過程是這樣的:先把 bbs 這個字符串作為形式變量I的值,帶入do后的語句中加以執行,也就是執行 echo %%I 語句,此時的I值為A,因此,第一次執行的結果,將會在屏幕上顯示A這個字符串;第二次執行和第一次執行的過程是一樣的,只不過此時I的值已經被替換為command1中的第二個元素了,也就是 B 這個字符串;如此循環,當第三次echo執行完畢之后,整條for語句才算執行完畢,此時,將執行下一條語句,也就是pause命令。

 高級用法:

1)搜索當前目錄下有哪些文件?

1
2
3
@ echo  off
for  %%i in  (*.*) do  echo  "%%i"
pause

2)搜索當前目錄下所有的文本文件?

1
2
3
@ echo  off
for  %%i in  (*.txt) do  echo  "%%i"
pause

一、參數 /d (參數只能顯示當前目錄下的目錄名字)  
  格式:FOR /D %variable IN (set) DO command [command-parameters]  
  這個參數主要用於目錄搜索,不會搜索文件,/D 參數只能顯示當前目錄下的目錄名字。(特別說明:只會搜索指定目錄下的目錄,不會搜索再下一級的目錄。)  
 
示例:  
  for /d %%i in (c:\*) do echo %%i  --顯示c盤根目錄下的所有目錄  
  for /d %%i in (???) do echo %%i  --顯示當前目錄下名字只有1-3個字母的目錄  
 
二、參數 /R (搜索指定路徑及所有子目錄中與set相符合的所有文件)  
  格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]  
  此命令會搜索指定路徑及所有子目錄中與set相符合的所有文件,注意是指定路徑及所有子目錄。  
 
  1、set中的文件名如果含有通配符(?或*),則列舉/R參數指定的目錄及其下面的所用子目錄中與set相符合的所有文件,無相符文件的目錄則不列舉。  
  2、如果set中為具體文件名,不含通配符,則枚舉該目錄樹(即列舉該目錄及其下面的所有子目錄)(並在后面加上具體的文件名),而不管set中的指定文件是否存在。  
  例:for /r c:\ %%i in (*.exe) do echo %%i --把C盤根目錄,和每個目錄的子目錄下面全部的EXE文件都列出來了!!!!  
 
示例:  
  for /r c:\ %%i in (boot.ini) do echo %%i --枚舉了c盤所有目錄  
  for /r d:\backup %%i in (1) do echo %%i  --枚舉d\backup目錄  
  for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i  --很好的搜索命令,列舉boot.ini存在的目錄  
 
三、參數 /L (該集表示以增量形式從開始到結束的一個數字序列。可以使用負的 Step)  

  格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]  
  該集表示以增量形式從開始到結束的一個數字序列。可以使用負的 Step  
 
示例:  
  for /l %%i in (1,1,5) do @echo %%i    --輸出1 2 3 4 5  
  for /l %%i in (1,2,10) do @echo %%i    --輸出1,3,5,7,9   
  for /l %%i in (100,-20,1) do @echo %%i    --輸出100,80,60,40,20  
  for /l %%i in (1,1,5) do start cmd    --打開5個CMD窗口  
  for /l %%i in (1,1,5) do md %%i    --建立從1~5共5個文件夾  
  for /l %%i in (1,1,5) do rd /q %%i    --刪除從1~5共5個文件夾 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM