Windows批处理 - 给自己写个库(3. INI文件的读取)

Posted EZhex1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows批处理 - 给自己写个库(3. INI文件的读取)相关的知识,希望对你有一定的参考价值。

在写bat时,经常会碰到需要把参数和代码逻辑分开的需求,以方便对程序进行调试和设置,在程序开头统一声明变量就是为了这样的效果。如果进一步考虑,我希望我的设置和我的程序完全分开,那就需要用到配置文件了。

对于为bat程序使用配置文件,txt肯定是最合适的,毕竟一般写bat程序就是在txt中写好再修改后缀名。

常用的配置文件“.ini”和“.cfg”大家一定不会陌生,这两种文件的后缀分别是单词“Initialization”和“Configuration”的缩写。即“初始化”和“配置”。一般来说,“.ini”文件是Windows的一种标准,“.cfg”则没有规范,两种文件都可以用记事本来编辑,格式包含“小节”,“键值对”,“注释”。

例如:task.ini

[task info]
taskname=backup
taskrun=.\\Start.bat

[schedule info]
schedule=weekly     ; minute, hourly, daily, weekly, monthly, once, onstart, onlongon, onidle, onevent, 
schedulemonth=jan   ; jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec, 
scheduleday=mon     ; mon, tue, wed, thu, fri, sat, sun, 
scheduletime=00:00:00

[runuser info]
specifyuser=0       ; 0:not use, 1:use
runuser=60000376
runpassword=888888

这是之前写的一个自动备份程序所用到的配置文件。其中有三个中括号括起来的小节名,每一小节下面都有几个键值对(Key-Value Pair),有些键值对的后面跟着分号,分号后是这个键值对的注释,标明这个键值对是用来干什么的或者它可以选用哪些值。

正常在C之类的高级语言(特别是有面向对象的高级语言)对该文件读取时,会把小节名也读入,不同的小节名下可以有相同的Key。但是在bat里。。。臣妾做不到啊。。。
所以这里建议大家不要在配置文件里写很多的东西,以保证所有的配置文件中都不存在相同的Key。。。
我们要做的,就是把这些键值对读取成bat中的变量和对应的值。

代码如下:INIReader.bat

for /f "usebackq delims=" %%a in (%1) do (
    set content=%%a
    if not "!content:~0,1!" == "[" (
        for /f "delims=; tokens=1" %%b in ("!content!") do (
            set content=%%b
            for /f "delims== tokens=1-2" %%i in ("!content!") do (
                set key=%%i
                    set key=!key: =!
                set value=%%j
                    set value=!value: =!
                set !key!=!value!
            )
        )
    )
)

逻辑如下:

  1. 读取一行文件(没有下一行就结束);
  2. 判断这一行是不是以“[”开头的,如果不是就继续,如果是就回到1;(过滤小节名)
  3. 把这一行内容用“;”隔开,取分号前的内容;(过滤分号后的注释)
  4. 把取到的内容用“=”隔开,取第一个值赋给Key,并把空字符去掉,取第二个值给Value,也把空字符去掉;(注意这里空白符是会去掉的,所以如果有文件路径,一定不能带空格。)
  5. 以Key的值声明变量,用Value的值进行赋值;
  6. 回到1;

这样就把文件中的键值对作为变量名和变量值存起来了,后面的程序中就可以直接使用配置文件中的变量了。(因为需要用到for命令,所以必须开启变量延迟setlocal enabledelayedexpansion

例子程序如下:test.bat

@echo off
setlocal enabledelayedexpansion

call "FilePath.bat" "task.ini"
call "INIReader.bat" "%AbsolutePath%"

echo %taskname%
echo %taskrun%
echo %schedule%

pause>nul

这里首先调用了“FilePath.bat”得到“task.ini”文件的绝对路径%AbsolutePath%
然后又调用“INIReader.bat”读取"%AbsolutePath%"中的内容(注意这里的引号);
然后就可以直接使用“task.ini”文件中的键值对了。

FilePath.bat是之前写的一段代码,具体请点击本段文字

以上是关于Windows批处理 - 给自己写个库(3. INI文件的读取)的主要内容,如果未能解决你的问题,请参考以下文章

Windows批处理 - 给自己写个库(4. 简易的Debug工具)

Windows批处理 - 给自己写个库(2. 获取格式化的日期和时间)

用C#自己动手写个操作系统,爽!

Linux系统上用QT编写ARM9继电器控制程序的问题。 想写个QT界面程序到arm板子上,通过界面的按钮来控制继电

用Python3写个12306抢票脚本

用Python3写个12306抢票脚本