為什麼這篇bat字串分割鄉民發文收入到精華區:因為在bat字串分割這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者LPH66 (-6.2598534e+18f)看板Programming標題Re: [問題] b...
※ 引述《ya6101461014 (MaxDing)》之銘言:
: 各位大大好
: 小弟想請問一下
: 目前有一個外部程式會產生一個ini檔
: 內容10行以內大概如下
: aaaaa - 111111
: aaaaa - 22222
: bbbbb - 22222
: 每次產生的內容都不一樣
: 我想寫一個bat去判斷如果有aaaaa - 22222
: 出現就做一個動作
: 目前使用for /f %%a去判斷 但是只能擷取到空格之前的
: aaaaa或是bbbbb
: 後面空格跟- 11111 或是- 22222沒辦法加到%%a內
: 有辦法判斷整行包含空格跟-嗎?
: 麻煩了謝謝各位
一般來說這有兩種方法, 都是使用 for /f 的額外關鍵字選項
這就要講到 for /f 是怎麼判定什麼東西要指定進變數的
首先在處理完 in (...) 裡面的來源之後
它會把各行拆開, 每一行是一次指定變數 + 執行 do 之後
指定變數的方法是把該行以空白做分界拆開, 把拆出來的第一個指定進變數
而這些關鍵字選項即是指定拆開方式的
上面提到的可以用的兩種
其一是 tokens= 它會把照分界拆開的字串根據所指定的第幾個指定進變數
也就是說, 沒寫的預設就是 tokens=1 的意思
可以指定多個, 用逗號分隔或寫成 x-y 這樣連續範圍
就會連續指定進照字母順序接下來的變數名
例如: for /f "tokens=1-3,6" %a in (file.txt) do ...
就會把前三個拆出來的字串指定進 %a, %b, %c 裡, 第六個指定進 %d 裡
最後面還可以多一個 * 這樣就是說指定的最後一個之後剩下的存進再下一個變數裡
如: for /f "tokens=2,5*" %a in (file.txt) do ...
就是第二個進 %a, 第五個進 %b, 第六個之後進 %c
另一個可以用的是 delims= 它會指定用來拆開字串的分界字元是什麼
例如如果來源檔案是逗號分隔的資料, 那就能用 "delims=," 來拆開
同樣可以指定多個, 直接併排就好了, 例如 "delims=,;" 就是用逗號和分號拆開
這兩個選項各自都可以達成把一行所有東西指定進單一變數裡
使用 tokens= 的話是 "tokens=*" 也就是從一開始所有的東西就直接存進變數
使用 delims= 的話是 "delims=@" 其中 @ 是一個你的檔案裡沒有出現過的字
====
(以下剪貼 for /? 的部份內容, 是這個語法的完整說明
在命令提示字元下打 for /? 可以查詢 for 的完整語法)
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
或,如果使用 usebackq 選項:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]
file-set 可以是一或多個檔案名稱。繼續進行 file-set 中的下個
檔案之前,都已開啟、讀取及處理過每個檔案。處理程序包括讀取
檔案、將它分割成獨立的文字行,然後將每一行剖析成零或多個語
法。使用已設成找到之語法字串的變數值,呼叫 For 迴圈的內容。
依照預設,/F 會從每個檔案的每一行傳送第一個以空格分隔的權
杖。空白行會被略過。您可以指定選擇性的 "options" 參數來覆寫
預設的剖析行為。這是有引號的字串,包含一或多個指定不同剖析
選項的關鍵字。關鍵字是:
eol=c - 指定一個行尾註解字元 (只有一個)
skip=n - 指定在檔案開頭要略過的行數。
delims=xxx - 指定分隔符號集。這會取代預設的空格
與定位字元的分隔符號集。
tokens=x,y,m-n - 指定每一行的哪些語法應該被傳到 for
的內部以進行每一個重複操作。這會造
成配置額外的變數名稱。m-n 格式代表
一個範圍,指定了第 m 個到第 n 個權
杖。如果 tokens= 字串的最後一個字
元是星號,則會配置一個額外的變數並
在最後一個語法被剖析後接收該行中的
其他文字。
usebackq - 指定新語義開始作用。其中反括號的字
串會被當作命令來執行,而單引號字串
是純文字字串命令,並且允許使用雙引
號來引用 file-set 中的檔名。
以下是一個範例:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
這會剖析 myfile.txt 檔案中的每一行,它不會去管以分號開頭的行數
,直接將第 2 個及第 3 個語法從每一行傳到 for 主體,而其語法是
用逗號和/或空格分開的。請注意,for 主體陳述式參照 %i 以取得第
二個語法,參照 %j 以取得第三個語法,使用 %k 取得第三個語法之
後的剩餘字串。因為檔案名稱含有空格,您必須用雙引號來括住檔案名
稱。要這樣使用雙引號,您必須使用 usebackq 參數。否則雙引號會被
解譯成用來定義一般文字。
使用 %i 明白地在 for 陳述式中宣告,並透過 tokens= option 使用
%j 作暗示性的宣告。您可以藉由 tokens= line 來指定最多 26 個語
法,前提是它宣告的變數不能高於字母 'z' 或 'Z'。請記住,FOR 變
數是單一字元的,同時在任一時間內,您不能同時使用超過 52 個 FOR
變數。
您也可以使用 FOR /F 命令在立即字串中剖析邏輯,方法是將括弧之間的
file-set 變成一個引號字串。它會被視為從檔案輸入的單行,並加
以剖析。
最後,您可以使用 FOR /F 命令來剖析一個命令的輸出。方法是將括弧
內的 file-set 變成單引號字串。它將被視為一個命令列,這個命令
行將會傳到子 CMD.EXE,而輸出將會被擷取到記憶體中,當成檔案來分
析。所以下列的範例:
FOR /F "delims==" %i IN ('set') DO @echo %i
將列舉目前環境中的環境變數名稱。
--
◢ ˊ_▂▃▄▂_ˋ. ◣ ▅▅ ▅▅ ι●╮ █▄▄▄▄▄
▍./◤_▂▃▄▂_◥ \'▊ HARUHI █████ <■┘ ▄▄▄▄▄▄▄
▎⊿ ◤◤◥█◥◥█Δ ISM By-gamejye ¢|\ ▌▌▌▌▌▄▌▌
▏ζ(▏●‵◥′●▊)Ψ ▏ █ ⊿Δ ▄▄▄ ▄▄▄▄
█/|▊ 〃 、 〃▋ |\ ▎ ハルヒ主義 █▄▄▄█▄▄
◥◥|◣ ‵′ ◢/'◢◢S.O.S 世界を大いに盛り上げるための涼宮ハルヒの団
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85
※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1460277496.A.E18.html