Re: [问题] bat档判断ini内容

楼主: LPH66 (-6.2598534e+18f)   2016-04-10 16:38:13
※ 引述《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
将列举目前环境中的环境变量名称。

Links booklink

Contact Us: admin [ a t ] ucptt.com