BAT教程 :第二節(for命令詳解 )
看了看第一節的東西,發現那些簡單的命令都有詳細解釋,實在想不出什麼更好的東西來解釋他們,就直接來一個"FOR命令詳解"在其中運用這些東西來解釋吧!
講FOR之前呢,咋先告訴各位新手朋友,如果你有什麼命令不懂,直接在CMD下面輸入:
name /?這樣的格式來看系統給出的協助檔案,比如for /?就會把FOR命令的協助全部顯示出來!當然許多菜鳥同志都看不懂....所以才會有那麼多批處理文章!!!!俺也照顧菜鳥,把FOR命令用我自己的方式說明下!
正式開始:
FOR這條命令基本上都被用來處理文本,我們這次除了要說他處理文本的作用外還要講他的其他一些好用的功能!
看看他的基本格式(這裡我引用的是批處理中的格式,直接在命令列只需要一個%號)
FOR參數%%變數名IN (相關檔案或命令) DO執行的命令
參數:FOR有4個參數/d /l /r /f 他們的作用我在下面用例子解釋
%%變數名:這個變數名可以是小寫a-z或者大寫A-Z,他們區分大小寫哦~
FOR會把每個讀取到的值給他!
IN:命令的格式,照寫就是了!
(相關檔案或命令) :FOR要把什麼東西讀取然後賦值給變數,不懂的話看下面的例子
do:命令的格式,照寫就是了!
執行的命令:對每個變數的值要執行什麼操作就寫在這.
看不懂我的這些說明,可以在CMD輸入for /?看系統提供的協助!我這裡也給出來吧,大家對照
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組檔案。可以使用萬用字元。
command 指定對每個檔案執行的命令。
command-parameters
為特定命令指定參數或命令列開關。
現在開始講每個參數的意思
/d
僅為目錄
如果Set (也就是我上面寫的"相關檔案或命令")包含萬用字元(*和?),將對與Set相匹配的每個目錄(而不是指定目錄中的檔案組)執行指定的Command。
這個參數其實我也沒弄太懂...有錯誤希望各位糾正!
系統協助的格式:FOR /D %%variable IN (set) DO command
他主要用於目錄搜尋,不會搜尋檔案,看這樣的例子
@echo off
for /d %%i in (*) do @echo %%i
pause
把他儲存放在C盤根目錄執行,就會把C盤目錄下的全部目錄名字列印出來,而檔案名稱字一個也不顯示!
在來一個,比如我們要把當前路徑下檔案夾的名字只有1-3個字母的打出來
@echo off
for /d %%i in (???) do @echo %%i
pause
這樣的話如果你目前的目錄下有目錄名字只有1-3個字母的,就會顯示出來,沒有就不顯示了
這裡解釋下*號和?號的作用,*號表示任意N個字元,而?號只表示任意一個字元
知道作用了,給大家個思考題目!
@echo off
for /d %%i in (window?) do @echo %%i
pause
儲存到C盤下執行,會顯示什麼呢?自己看吧!
/D參數只能顯示目前的目錄下的目錄名字,這個大家要注意!
/R
遞迴
進入根目錄樹[Drive:]Path,在樹的每個目錄中執行for語句。如果在/R後沒有指定目錄,則認為是目前的目錄。如果Set只是一個句點(.),則只枚舉分類樹。
系統協助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command
上面我們知道,/D只能顯示當前路徑下的目錄名字,那麼現在這個/R也是和目錄有關,他能幹嘛呢?放心他比/D強大多了!
他可以把當前或者你指定路徑下的檔案名稱字全部讀取,注意是檔案名稱字,有什麼用看例子!
@echo off
for /r c:\ %%i in (*.exe) do @echo %%i
pause
咋們把這個BAT儲存到D盤隨便哪裡然後執行,我會就會看到,他把C盤根目錄,和每個目錄的子目錄下面全部的EXE檔案都列出來了!!!!
再來一個
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
參數不一樣了吧!這個命令前面沒加那個C:\也就是搜尋路徑,這樣他就會以目前的目錄為搜尋路徑,比如你這個BAT你把他防災d:\test目錄下執行,那麼他就會把D:\test目錄和他下面的子目錄的全部EXE檔案列出來!!!
這個參數大家因該理解了吧!還是滿好玩的命令!
/L
迭代數值範圍
使用迭代變數設定起始值(Start#),然後逐步執行一組範圍的值,直到該值超過所設定的終止值(End#)。/L將通過對Start#與End#進行比較來執行迭代變數。如果Start#小於End#,就會執行該命令。如果迭代變數超過End#,則命令解釋程式退出此迴圈。還可以使用負的Step#以遞減數值的方式逐步執行此範圍內的值。例如,(1,1,5)產生序列1 2 3 4 5,而(5,-1,1)則產生序列(5 4 3 2 1)。文法是:
系統協助的格式:for /L %% Variable in (Start#,Step#,End#) do Command
看著這說明有點暈吧!咋們看例子就不暈了!
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
儲存執行看效果,他會列印從1 2 3 4 5 這樣5個數字
(1,1,5)這個參數也就是表示從1開始每次加1直到5終止!
大會暈,就列印個數字有P用...好的滿足大家,看這個例子
@echo off
for /l %%i in (1,1,5) do start cmd
pause
執行後是不是嚇了一跳,怎麼多了5個CMD視窗,呵呵!如果把那個(1,1,5)改成(1,1,65535)會有什麼結果,我先告訴大家,會開啟65535個CMD視窗....這麼多你不死機算你強!
當然我們也可以把那個start cmd改成md %%i這樣就會建立指定個目錄了!!!名字為1-65535
看完這個被我賦予破壞性質的參數後,我們來看最後一個參數
/f
\迭代及檔案解析
使用檔案解析來處理命令輸出、字串及檔案內容。使用迭代變數定義要檢查的內容或字串,並使用各種ParsingKeywords選項進一步修改解析方式。使用ParsingKeywords令牌選項指定哪些令牌應該作為迭代變數傳遞。請注意:在沒有使用令牌選項時,/F將只檢查第一個令牌。
檔案解析過程包括讀取輸出、字串或檔案內容,將其分成獨立的文本行以及再將每行解析成零個或更多個令牌。然後通過設定為令牌的迭代變數值,調用for迴圈。預設情況下,/F傳遞每個檔案每一行的第一個空白分隔字元號。跳過空行。
系統協助的格式:
for /F "ParsingKeywords" %% Variable in (FileNameSet) do Command
有沒有發現這個參數說明比上面幾個都多...沒辦法,人們用FOR命令主要也就是用/f參數,FOR的主場啊!大家得好好看!
先來解釋下那個多出來的"ParsingKeywords"
他表示4個參數
eol=c -指一個行注釋字元的結尾(就一個)
skip=n -指在檔案開始時忽略的行數。
delims=xxx -指分隔字元集。這個替換了空格和跳格鍵的
預設分隔符號集。
tokens=x,y,m-n -指每行的哪一個符號被傳遞到每個迭代
的for本身。這會導致額外變數名稱的分配。m-n
格式為一個範圍。通過nth符號指定mth。如果
符號字串中的最後一個字元星號,
那麼額外的變數將在最後一個符號解析之後
分配並接受行的保留文本。
usebackq -指定新文法已在下類情況中使用:
在作為命令執行一個後引號的字串並且一個單
引號字元為文字字串命令並允許在filenameset
中使用雙引號擴起檔案名稱。
先別暈了!我這就舉個例子協助大家來理解這些參數!
usebackq這個參數不用理解了,系統預設會給我們加上!
為了能使用這個例子,我們先建立一個文字檔,在裡面打上這些內容儲存為test.txt:
;鬱悶啊!
您好!歡迎來到,非常批處理
我們的網站bbs.verybat.cn
完畢!
@echo off
FOR /F "eol=; tokens=1 delims= " %%i in (test.txt) do @echo %%i
pause
我們把這個BAT儲存到和你的test.txt相同的目錄下面然後執行
我們會看到螢幕上會顯示
您好!
我們的網站
完畢!
為什麼會這樣?我來解釋
這個命令會讀取在目前的目錄下名為test.txt檔案中的內容,將每一行的內容賦值給變數%%i,忽略掉以;號開頭的行,並且以空格做為分隔字元號,列印每行以空格做分隔字元號的第一列
結果就是這樣了!!
如果改成
當然我們想要把全部檔案內容直接列印出來就可以這樣
@echo off
FOR /F "delims=" %%i in (test.txt) do @echo %%i
pause
另外/F參數還可以以輸出命令的結果看這個例子
@echo off
FOR /F "delims=" %%i in ('net user') do @echo %%i
pause
這樣你本機全部帳號名字就出來了把擴號內的內容用兩個單引號引起來就表示那個當命令執行,FOR會返回命令的每行結果,加那個"delims="是為了讓我空格的行能整行顯示出來,不加就只顯示空格左邊一列!
基本上講完了FOR的基本用法了...如果你看過FOR的系統協助,你會發現他下面還有一些特定義的變數,這些我先不講.大家因該都累了吧!你不累我累啊....
本節到此結速,希望對各位有所協助!