作者LPH66 (-6.2598534e+18f)
看板Programming
标题Re: [问题] bat档判断ini内容
时间Sun Apr 10 16:38:13 2016
※ 引述《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://webptt.com/cn.aspx?n=bbs/Programming/M.1460277496.A.E18.html
1F:推 ya6101461014: 了解了 谢谢大大 223.140.124.55 04/11 15:56
2F:推 oscar60111: 推 长知识了 <_ _> 140.125.33.221 04/12 02:47