看板 Programming 關於我們 聯絡資訊
※ 引述《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= 的話是 "[email protected]" 其中 @ 是一個你的檔案裡沒有出現過的字 ==== (以下剪貼 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
ya6101461014: 了解了 謝謝大大 223.140.124.55 04/11 15:56
oscar60111: 推 長知識了 <_ _> 140.125.33.221 04/12 02:47