2017/03/13

Windows利用批次檔(Batch)讀取指令執行的結果或文字檔案內容 for /f %i in ...

透過指令去了解「/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」的魅力了吧?

以下用文字文件test.txt來解釋

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

第一個「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」有可能需要用空白,所以建議擺在最後一個,避免判斷錯誤。

其實到這邊就可以結束了,不過還是要提醒「/f」有很多方法可以用,如刪除每一槽下的「Autorun.inf」:
for /f %i in (‘mountvol ^| find “:\”‘) do del /s q %iAutorun.inf
就是一個很簡單的實例。

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

沒有留言:

張貼留言