找回密码
 加入
搜索
查看: 4691|回复: 5

[系统综合] dos下怎么读INI文件【已解决】

[复制链接]
发表于 2011-4-26 08:39:12 | 显示全部楼层 |阅读模式
本帖最后由 redapple2008 于 2011-4-28 08:51 编辑

DOS命令行下稳定速度之快是大家共知,所以想请叫一下怎么读配置文件,就如同AU3一样,把读取的内容做变一个变量,让其他代码调用。
 楼主| 发表于 2011-4-26 08:40:02 | 显示全部楼层
BAT 读取ini配置文件方法dos
ini文件实例。

bat去读取ini文件时,我们假设:
文件只有一个section,而且section的头在第一行,这间不会有空格。这们我们可以在读取时先掠过第一行,直接读取数。
config.ini文件内容如下:
[Common]
ITEM1=ITEM_1
ITEM2=ITEM_2
ITEM3=ITEM_3

读取ini文件我们写成一个BAT文件,这样在其它BAT中都可以调用。
readconfig.bat

CALL :readconfig %1 %2

:readconfig
  for /f "skip=1 tokens=1,2 delims==" %%a IN (jvz.ini) Do if %1==%%a set %2=%%b & @echo readconfig get %%a, value is %%b
  goto :eof

调用时的方法:
CALL readconfig ITEM1 ITEM1_VALUE
ECHO %ITEM1_VALUE%

有没有人能解释一下了?
发表于 2011-4-26 13:16:01 | 显示全部楼层
我给你解释下关键这条命令。
for /f "skip=1 tokens=1,2 delims==" %%a IN (jvz.ini) Do if %1==%%a set %2=%%b & @echo readconfig get %%a, value is %%b
解释如下:
1.for 命令格式
        对一组文件中的每一个文件执行某个特定命令。

        FOR %variable IN (set) DO command [command-parameters]

          %variable  指定一个单一字母可替换的参数。
          (set)      指定一个或一组文件。可以使用通配符。
          command    指定对每个文件执行的命令。
          command-parameters
                                 为特定命令指定参数或命令行开关。

        在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
        而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

        如果命令扩展被启用,下列额外的 FOR 命令格式会受到
        支持:

        FOR /D %variable IN (set) DO command [command-parameters]

                如果集中包含通配符,则指定与目录名匹配,而不与文件
                名匹配。

        FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

                检查以 [drive:]path 为根的目录树,指向每个目录中的
                FOR 语句。如果在 /R 后没有指定目录,则使用当前
                目录。如果集仅为一个单点(.)字符,则枚举该目录树。

        FOR /L %variable IN (start,step,end) DO command [command-parameters]

                该集表示以增量形式从开始到结束的一个数字序列。
                因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
                序列 (5 4 3 2 1)。

        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]

                filenameset 为一个或多个文件名。继续到 filenameset 中的
           下一个文件之前,每份文件都已被打开、读取并经过处理。
                处理包括读取文件,将其分成一行行的文字,然后将每行
                解析成零或更多的符号。然后用已找到的符号字符串变量值
                调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
                的第一个空白符号。跳过空白行。您可通过指定可选 "options"
                参数替代默认解析操作。这个带引号的字符串包括一个或多个
                指定不同解析选项的关键字。这些关键字为:

                        eol=c           - 指一个行注释字符的结尾(就一个)
                        skip=n          - 指在文件开始时忽略的行数。
                        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                                                          默认分隔符集。
                        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                                                          的 for 本身。这会导致额外变量名称的分配。m-n
                                                          格式为一个范围。通过 nth 符号指定 mth。如果
                                                          符号字符串中的最后一个字符星号,
                                                          那么额外的变量将在最后一个符号解析之后
                                                          分配并接受行的保留文本。
                        usebackq        - 指定新语法已在下类情况中使用:                    
                                                          在作为命令执行一个后引号的字符串并且一个单
                                                          引号字符为文字字符串命令并允许在 filenameset
                                                          中使用双引号扩起文件名称。

                某些范例可能有助:

        FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

                会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
                每行中的第二个和第三个符号传递给 for 函数体,用逗号和/或
                空格分隔符号。请注意,此 for 函数体的语句引用 %i 来
                获得第二个符号,引用 %j 来获得第三个符号,引用 %k
                来获得第三个符号后的所有剩余符号。对于带有空格的文件
                名,您需要用双引号将文件名括起来。为了用这种方式来使
                用双引号,还需要使用 usebackq 选项,否则,双引号会
                被理解成是用作定义某个要分析的字符串的。

                %i 在 for 语句中显式声明,%j 和 %k 是通过
                tokens= 选项隐式声明的。可以通过 tokens= 一行
                指定最多 26 个符号,只要不试图声明一个高于字母 "z" 或
                "Z" 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;
                而且,不能同时使用超过 52 个。

                还可以在相邻字符串上使用 FOR /F 分析逻辑,方法是,
                用单引号将括号之间的 filenameset 括起来。这样,该字符
                串会被当作一个文件中的一个单一输入行进行解析。

                最后,可以用 FOR /F 命令来分析命令的输出。方法是,将
                括号之间的 filenameset 变成一个反括字符串。该字符串会
                被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到
                内存中,并被当作文件分析。如以下例子所示:

                  FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

                会枚举当前环境中的环境变量名称。

        另外,FOR 变量参照的替换已被增强。您现在可以使用下列
        选项语法:

                 %~I          - 删除任何引号("),扩展 %I
                 %~fI        - 将 %I 扩展到一个完全合格的路径名
                 %~dI        - 仅将 %I 扩展到一个驱动器号
                 %~pI        - 仅将 %I 扩展到一个路径
                 %~nI        - 仅将 %I 扩展到一个文件名
                 %~xI        - 仅将 %I 扩展到一个文件扩展名
                 %~sI        - 扩展的路径只含有短名
                 %~aI        - 将 %I 扩展到文件的文件属性
                 %~tI        - 将 %I 扩展到文件的日期/时间
                 %~zI        - 将 %I 扩展到文件的大小
                 %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                                           到找到的第一个完全合格的名称。如果环境变量名
                                           未被定义,或者没有找到文件,此组合键会扩展到
                                           空字符串

        可以组合修饰符来得到多重结果:

                 %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
                 %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
                 %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
                 %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
                                           到找到的第一个驱动器号和路径。
                 %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR

        在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
        用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
        比较易读,而且避免与不分大小写的组合键混淆。

2.明白了上述的格式,这条命令就不难理解了。
        /f 参数 代表要要提取文件
        skip=1 代表要跳过的行数,本例中为一行
        tokens=1,2 代表要提取的是第一个和第二个变量(FOR命令提取出的变量只用设置第一个,以后递加)
        delims==  代表拆分的字符为“=” 相当于stringsplit命令
        %%a  批处理中,定义的变量前面要加上两个%,要不然存成.bat文件后,执行时候不能识别该变量。FOR命令中,如果第一个参数设置为%%a,那么第二个为%%b,以此类推……
        IN (jvz.ini) 代表要提取的数据在jvz.ini这个文件里。 对应的是/F参数。也就是,前面用/F,这里必须用文件名
        Do 后面紧跟着操作。 也就是前面的FOR循环的循环体。
        if %1==%%a set %2=%%b & @echo readconfig get %%a, value is %%b 这句整体算作一个循环体。接下来详细解释。
                if 后面紧跟着判断语句和操作语句。 相当于 if……then……
                %1==%%a %1是批处理调用的时候,传递过来的第一个参数,%%a是FOR命令运行的时候,设置的第一个参数。这条语句是指调用这个批处理时候传递过来的第一个参数和FOR命令从配置文件中提出来的第一个数据相等。
                set %2=%%b 设置调用时候传递过来的第二个参数为FOR命令中获得的第二个参数。
                &  该操作符的作用是将前后两句一起执行。 相当于多句语句。 还有个“|”操作符,意思前面的结果后面也能使用。经典例子是 dir C:\*.EXE /S /A /B|FIND "SVCHOST.EXE" 意思是遍历C盘,找出svchost.exe
                @echo readconfig get %%a, value is %%b 将获取的配置信息显示出来。 @符号的作用是本行命令不显示出来。 自己在命令行用 ECHO 123 和 @ECHO 123,就明白区别在哪了。
3.综所上述,这条命令的使用方式是:将该命令存储为BAT文件,使用的时候,用CALL 文件名.bat 参数1 参数2即可获得配置文件中的参数2。也就是你配置文件中ITEM1=ITEM_1 等号后面的ITEM_1 。
  ECHO %ITEM1_VALUE% 这行的意思是将结果显示出来。  DOS中变量的引用是通过两个%引用的。  如:%变量名%
 楼主| 发表于 2011-4-26 16:24:40 | 显示全部楼层
我给你解释下关键这条命令。
for /f "skip=1 tokens=1,2 delims==" %%a IN (jvz.ini) Do if %1==%%a set % ...
lanfengc 发表于 2011-4-26 13:16



    谢谢了!
十分感谢。
 楼主| 发表于 2011-4-26 16:27:09 | 显示全部楼层
主要是循环体,向你学习了
 楼主| 发表于 2011-4-28 08:48:53 | 显示全部楼层
结贴了。问题已经解决了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-2 06:31 , Processed in 0.077227 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表