命令提示字元 19:迴圈進階

「/f」到底有什麼魅力呢?他功能多到必須要先解釋。首先,括弧裡面可用三種模式:

(檔案)
("字串")
('指令')

這樣沒有人看得懂,所以範例:

for /f %i in (Test.txt) do echo %i

因為預設是以空白(Space)或跳位(Tab)做切割,所以不是整行讀取。

for /f %i in ("This is a test.") do echo %i

也是以空白做分隔。

for /f %i in ('dir /b') do echo %i

這樣就可以知道「/f」的魅力了吧?



在前面參數可以自訂以取得想要的結果,用以下文字文件來解釋:


第一個「delims」:

for /f "delims=]" %i in (Test.txt) do echo %i

就是指定字元去分割字串,當然「]」不存在,所以整句會直接上去,預設是空白(Space)或跳位(Tab)。而下面這樣會比較好懂:

for /f "delims=a" %i in (Test.txt) do echo %i

二個字也行喔:

for /f "delims=ai" %i in (Test.txt) do echo %i

接下來是「skip」:

for /f "skip=1" %i in (Test.txt) do echo %i

就是第一行不要處理啦!下一個是「eol」:

for /f "eol=$" %i in (Test.txt) do echo %i

就是前面有符號「$」不要處理啦!下一個「tokens」比較複雜:

for /f "tokens=1,2,3" %i in (Test.txt) do echo %i %j %k

他是說,把字串以空白切出來,所以「This is a test.」會被切成「This」「is」「a」「test.」,而取其中第 1, 2, 3 段分別丟到 %i, %j, %k 中。這是「tokens」特殊用法,被切出來的會依序從原指令 in 前面的 %i 開始丟。下面這樣也可以:

for /f "tokens=1,2,3" %i in (Test.txt) do echo %i %j %k

用連字號也沒有問題。最後一個是沒有用過的「usebackq」:

for /f "usebackq" %i in ("Test.txt") do echo %i

是指原本用來表示「(檔案)」改成「("檔案")」、「("字串")」改成「('字串')」、「('指令')」改成「(`指令`)」。應該是為了要避免跳脫字元的關係,但個人沒有過的原因那就直接用跳脫字元就好了啊!補充一下:

for /f "eol=$ skip=1 tokens=1-4 delims=a" %i in ("Test.txt") do echo %k

參數是可以混搭的,要注意「delims」有可能需要用空白,所以建議擺在最後一個,避免判斷錯誤。



「for /f」實在是一個很實用的指令,但也是整個教學裡面最難學的。不過學完這個應該也會覺得還好,命令提示字元也不過爾爾,沒錯!的確沒有很難。下一章沒有新知識了,博君一笑罷了。



下一章:說文解字




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。

2 則留言:

  1. skip的範例輸出結果應該有誤

    回覆刪除
    回覆
    1. 謝謝提醒
      這個文章放了快二年終於被發現錯誤了

      其實這些範例的圖不是真的顯示出來的結果
      是用 type 顯示文字檔的結果
      所以會有一些問題

      skip 部份的結果應該會顯示完整的句子
      除非加上 "skip=1 delims=i" 才會出現那個結果

      現在找機會看有沒有辦法改成 Windows 10 版本
      Windows 10 一小部份,但變得更加實用

      刪除

定時會整理。