1. 程式人生 > >【Windows】Windows中解析DOS的for命令使用

【Windows】Windows中解析DOS的for命令使用

文件打開 多少 command 忽略 文件的 mouseover 和數 參數 路徑

目錄結構:

contents structure [+]
  1. 簡介
  2. for /d ... in ...
    1. 案例
      1. 案例:打印C://根目錄下所有的文件夾名稱
      2. 案例:打印當前路徑下,只有1-3個字母的文件夾名
      3. 案例:顯示所有以window開始的文件夾名稱
  3. for /r ... in ...
    1. 案例
      1. 案例:顯示當前目錄及子目錄下的所有以.exe結尾的文件名
      2. 案例:顯示當前目錄及子目錄的所有目錄名
  4. for /L ... in ...
    1. 案例
      1. 案例:增加5個CMD窗口
  5. 監聽 菜單鍵
    1. delims關鍵字
    2. tokens關鍵字
    3. 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命令使用