**:
含有/f的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 /f %%i in (file) do command
file為檔名,按照官方的說法是,for會依次將file中的檔案開啟,並且在進行到下乙個檔案之前將每個檔案讀取到記憶體,按照每一行分成乙個乙個的元素,忽略空白的行,看個例子。
假如檔案a.txt中有如下內容:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
你想顯示a.txt中的內容,會用什麼命令呢?當然是type,type a.txt
for也可以完成同樣的命令:
for /f %%i in (a.txt) do echo %%i
還是先從括號執行,因為含有引數/f,所以for會先開啟a.txt,然後讀出a.txt裡面的所有內容,把它作為乙個集合,並且以每一行作為乙個元素,所以會產生這樣的集合,
//第三個元素
集合中只有3個元素,同樣用%%i依次代替每個元素,然後執行do後面的命令。
具體過程:
用%%i代替「第1行第1列 第1行第2列 第1行第3列」,執行do後面的echo %%i,顯示「第1行第1列 第1行第2列 第1行第3列」,
用%%i代替「第2行第1列 第2行第2列 第2行第3列」,執行echo %%i,顯示「第2行第1列 第2行第2列 第2行第3列」,
依次,直到每個元素都代替完為止。
為了加強理解/f的作用,請執行一下兩個命令,對比即可明白:
for /f %%i in (a.txt) do echo %%i //這個會顯示a.txt裡面的內容,因為/f的作用,會讀出a.txt中
的內容。
for %%i in (a.txt) do echo %%i //而這個只會顯示a.txt這個名字,並不會讀取其中的內容。
通過上面的學習,我們發現for /f會預設以每一行來作為乙個元素,但是如果我們還想把每一行再分解更小的內容,該怎麼辦呢?不用擔心,for命令還為我們提供了更詳細的引數,使我們將每一行分為更小的元素成為可能。
它們就是:delims和tokens
delims 用來告訴for每一行應該拿什麼作為分隔符,預設的分隔符是空格和tab鍵
比如,還是上面的檔案,我們執行下面的命令:
for /f "delims= " %%i in (a.txt) do echo %%i
顯示的結果是:
第1行第1列
第2行第1列
第3行第1列
為什麼是這樣的呢。因為這裡有了delims這個引數,=後面有乙個空格,意思是再將每個元素以空格分割,預設是只取分割之後的第乙個元素。
執行過程是:
將第乙個元素「第1行第1列 第1行第2列 第1行第3列」分成三個元素:「第1行第1列」 「第1行第2列」 「第1行第3列」,它預設只取第乙個,即「第1行第1列」,然後執行do後面的命令,依次類推。
但是這樣還是有侷限的,如果我們想要每一行的第二列元素,那又如何呢?
這時候,tokens跳出來說,我能做到。
它的作用就是當你通過delims將每一行分為更小的元素時,由它來控制要取哪乙個或哪幾個。
還是上面的例子,執行如下命令:
for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i
執行結果:
第1行第2列
第2行第2列
第3行第2列
如果要顯示第三列,那就換成tokens=3。
同時tokens支援萬用字元*,以及限定範圍。
此時的命令為:
for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
怎麼多出乙個%%j?
這是因為你的tokens後面要取每一行的兩列,用%%i來替換第二列,用%%j來替換第三列。
並且必須是按照英文本母順序排列的,%%j不能換成%%k,因為i後面是j
執行結果為:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
對以萬用字元*,就是把這一行全部或者這一行的剩餘部分當作乙個元素了。
比如:for /f "tokens=* delims= " %%i in (a.txt) do echo %%i
執行結果為:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
其實就跟for /f %%i in (a.txt) do echo %%i的執行結果是一樣的。
再如:for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j
執行結果為:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
用%%i代替第二列,用%%j代替剩餘的所有
最後還有skip合eol,這倆個簡單,skip就是要忽略檔案的前多少行,而eol用來指定當一行以什麼符號開始時,就忽略它。
比如:for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i
結果為:
第3行第1列 第3行第2列 第3行第3列
用skip來告訴for跳過前兩行。
如果不加tokens=*的話,執行結果為:
第3行第1列
不知道怎麼回事。
再如,當a.txt內容變成:
.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
執行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i結果是:
第3行第1列 第3行第2列 第3行第3列
用eol來告訴for忽略以「.」開頭的行。
同樣也必須加tokens=*,否則只會顯示「第3行第1列」
含有 F的for 轉)
含有 f的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 這個可能是最常用的,也是最強的命令,主要用來處理檔案和一...
JSON 轉含有泛型屬性的物件
在將 json 字串轉為物件時,如果物件含有泛型,在進行轉換時需要指明泛型型別。describe author chenfan date 2019 5 9 19 15 data 含有泛型屬性的物件 class onegeneric data 泛型物件 class keymessage public ...
對mongodb含有大寫英文本母的字段轉為小寫
今天產品經理給我乙個任務,說頁面顯示的英文本母有大寫的,看起來非常難受,讓我把大寫的字母都變成小寫的。var find db 你所操作的表名 find limit 40 find.foreach function event 值得注意的是 我上面的是這種格式查詢 find 第乙個大括號是查詢條件,第...