【Windows】Windows中解析DOS的for命令使用
目錄結構:
contents structure [+]
- 簡介
- for /d ... in ...
- 案例
- 案例:打印C://根目錄下所有的文件夾名稱
- 案例:打印當前路徑下,只有1-3個字母的文件夾名
- 案例:顯示所有以window開始的文件夾名稱
- for /r ... in ...
- 案例
- 案例:顯示當前目錄及子目錄下的所有以.exe結尾的文件名
- 案例:顯示當前目錄及子目錄的所有目錄名
- for /L ... in ...
- 案例
- 案例:增加5個CMD窗口
- 監聽 菜單鍵
- delims關鍵字
- tokens關鍵字
- skip和eol關鍵字
一.簡介
在DOS窗口中,輸入for /?查看官方給出的for命令的用法。
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可以使用通配符(* 和 ?)。
command 指定對每個文件執行的命令。
command-parameters 為特定命令指定參數或命令行開關。 現在開始講每個參數的意思
我們知道了一個for命令的基本格式為:FOR 參數 %變量名 IN (相關文件或命令) DO 執行的命令。這裏需要註意在DOS窗口中和在批處理文件中,for命令的格式有一定的差別,在DOS窗口中,變量以單百分號加字母表示,但若是在批處理文件中,變量以雙百分號加字母表示,批處理文件中,for命令的基本格式為:FOR 參數 %%變量名 IN (相關文件或命令) DO 執行的命令
參數有四種,分別為/d、/r、/L、/f,每一種參數對應的for命令的具體格式也有所不同。接下來以此講解每一種參數的使用:
接下來的所有案例,若不是特別說明,都是以批處理文件的方式。
二.for /d ... in ...
/d表示目錄搜索,它主要用於搜索目錄,不會搜索文件。
for命令的格式為:FOR /D %%variable IN (set) DO command
如果set包含通配符,將對set想匹配的每個目錄執行Command,%%variable代表了每一個目錄。
2.1 案例
案例:打印C://根目錄下所有的文件夾名稱
@echo off rem 進入到c盤根目錄 c: rem 打印當前目錄下的所有文件夾名稱 for /d %%i in (*) do @echo %%i pause
案例:打印當前路徑下,只有1-3個字母的文件夾名稱
@echo off
for /d %%i in (???) do @echo %%i
pause
案例:顯示所有以window開始的文件夾名稱
@echo off
rem 進入到C盤
c:
rem 顯示所有以window開始的文件夾名稱
for /d %%i in (window?) do @echo %%i
pause
三.for /r ... in ...
/r表示遞歸,以遞歸的方式對當前目錄下的每個目錄執行操作。
for命令的格式為:FOR /R [[drive:]path] %%variable IN (set) DO command
中括號[]表示可有可無,如果不指定開始遞歸的根目錄,則以當前目錄作為遞歸的根目錄。
這裏需要註意,若set為點(.),則只枚舉目錄樹。
3.1 案例
案例:顯示C盤中所有以.exe結尾的文件名
@echo off
for /r c: %%i in (*.exe) do @echo %%i
pause
案例:顯示當前目錄及子目錄下的所有以.exe結尾的文件名
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
案例:顯示當前目錄及子目錄的所有目錄名
@echo off
for /r %%i in (.) do @echo %%i
pause
現在清楚了/d 和 /r 參數的同異點了,他們都和目錄有關,但/d只會檢索當前目錄下的所有目錄,但/r可以以遞歸的方式檢索所有目錄。
四.for /L ... in ...
/L可以寫成小寫字母的/l,為了和數字1區分,下面還是用大寫的字母L。
/L表示叠代變量,在給定的起點、步長、終點叠代數據。
for命令的格式:for /L %%Variable in (Start#,Step#,End#) do Command
使用叠代變量設置起始值 (Start#),然後逐步執行一組範圍的值,直到該值超過所設置的終止值 (End#)。/L 將通過對 Start# 與 End# 進行比較來執行叠代變量。如果 Start# 小於 End#,就會執行該命令。
4.1案例
案例:打印1到5
@echo off
for /L %%i in (1,1,5) do @echo %%i
pause
案例:增加5個CMD窗口
@echo off
for /L %%i in (1,1,5) do start cmd
pause
會發現,新增加了5個CMD窗口,若是(1,1,65535)呢,就會多開啟65535個CMD窗口。如果把上面的start cmd換成 md %%i,那麽就可以多建立5個文件夾。
五.for /f ... in ...
含有/f的for命令使用最多,
for命令的格式:
FOR /F ["options"] %%i IN (file) DO command
FOR /F ["options"] %%i IN ("string") DO command
FOR /F ["options"] %%i IN (command) DO command
file代表一個或多個文件
string 代表字符串
command代表命令
["options"] 可選
對於for命令的三個格式都大通小異,IN(file),IN("string"),IN(command)分別表示從文件、字符串、命令中讀取數據。
file為文件名,按照官方的說法是,for會依次將file中的文件打開,並且在進行到下一個文件之前將每個文件讀取到內存,按照每一行分成一個一個的元素,忽略空白的行,看個例子。
假如文件a.txt中有如下內容:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
可以使用type命令來顯示:
@echo off
type a.txt
pause
顯示如下:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
使用for命令同樣也可以完成這個功能:
@echo off
for /f "delims=\n" %%i in (a.txt) do echo %%i
pause
其中delims=\n表示以換行符分割,
@echo off
for /f %%i in ("asas daa") do @echo %%i
pause
上面的語句會顯示asas。
delims關鍵字
delims關鍵字表示分隔符,需要註意若不指定delims那麽,默認以空格和Tab鍵分割。如果按照下面的格式使用空格來顯示的話:
@echo off
for /f "delims= " %%i in (a.txt) do echo %%i
pause
顯示:
第1行第1列
第2行第1列
第3行第1列
可以看出值顯示了第一列的值
tokens關鍵字
tokens命令可以指定顯示哪一列的數據,該命令還支持通配符(*)
@echo off
for /f "tokens=2,3 delims= " %%i in (a.txt) do @echo %%i %%j
pause
效果:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
在上面的命令中多了%%j,這是for命令自動添加上的,通過"tokens=2,3 delims= "表示以空格為分割符號,取沒行的第2和第3列數據。並且把第列的數據賦值給%%i,把第三列的數據賦值給%%j。如果要把第二列和第三列顯示到同一列,那麽可以把tokens=2,3換為tokens=2-3。
對於通配符就是把這一行或是剩下的全部元素作為一列數據
@echo off
for /f "tokens=1,*" %%i in (a.txt) do @echo %%i %%j
pause
顯示:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
skip和eol關鍵字
skip就是要忽略文件的前多少行,而eol用來指定當一行以什麽符號開始時,就忽略它。
@echo off
for /f "skip=2 tokens=*" %%i in (a.txt) do @echo %%i
pause
【Windows】Windows中解析DOS的for命令使用