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;(过滤小节名)
- 把这一行内容用“;”隔开,取分号前的内容;(过滤分号后的注释)
- 把取到的内容用“=”隔开,取第一个值赋给Key,并把空字符去掉,取第二个值给Value,也把空字符去掉;(注意这里空白符是会去掉的,所以如果有文件路径,一定不能带空格。)
- 以Key的值声明变量,用Value的值进行赋值;
- 回到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. 获取格式化的日期和时间)