【vbs】vbs写ini文件

这两天在折腾给一个项目打安装包,第一次接触软件打包,用的Advanced Installer(以下简称AI),应该说如果安装过程没有特殊动作(常规动作指释放文件、写注册表、建快捷方式等)的话,倒挺傻瓜的,按照向导和界面操作就能打好一个包。但我的安装动作包括:

- 提供一个ComboBox列出已安装打印机让用户选择

- 让用户填写一些初始参数并在安装完成后把这些参数写入安装目录中的指定ini和xml文件中

第一个需求就折腾了我大半天,难点在于动态填充ComboBox项,资料和文档不好找,又是E文,好在天道酬勤,愣是让我在官方论坛中刨到有用的帖子,总算搞掂,或者我会另开一文说说如何做的,以助后来者。

接下来就是获取用户的输入,然后写入指定ini和xml中。AI可以自由发挥的途径个人认为不算少,它的自定动作(Custom Actions)可以调用exe/js/vbs等东东,但js和vbs我没什么底子,有点畏难情绪,想用自己熟悉的方式来解决问题,就是用c#写个exe,通过main函数传参,把参数写入ini和xml~很容易的事。但仔细想想,一来,.net程序依赖CLR,虽说安装过程可以指定必要组件,强制用户把.net装好,不用担心执行到该.net程序时缺乏运行环境,但总感觉在安装包中嵌入.net程序好像不太地道,再有.net程序首次运行需唤醒CLR,我安装过程求的就是顺畅,为了一个简单任务就要等待CLR启动,即便只是一两秒,也是我不能忍受的;二来,即便我有信心短时间内学会另一门非托管语言(delphi/c++啥的)来完成这个简单任务,但exe体积也必然会大大超过脚本的,这会增大整个安装包的体积,没必要。所有思来想去,还是决定搞一搞vbs。

只是他娘的,用惯优雅的C#,感觉其它语言就像屎一样,更别说像vbs这种脚本还没什么像样的ISE,总之很佩服主要coding在这些语言上的码农们,完全是受虐。whatever~一开始本来想找找vbs调用win32 API的方法,如果可以的话,那调一调WritePrivateProfileString就完事了,可找来找去,发现似乎vbs不能直接调API(没找到官方说法,故暂存疑),网上高人的办法有二:一是用vbs调用office的vba组件,再操作vba来调用api~真叫一个迂回,同时也感叹高人的智慧呐;二是往系统中扔一个dynwrap.dll就可以调了,话说这dll的出处还颇为神秘,搜不到,文件信息和内容也没看出什么端倪,人作者这才是真雷锋啊。anyway,上述方法对于我做安装包来说,万万不能考虑,所以,还是老实研究地道vbs法,小有成果,分享如下:

'函数:设置ini值(ini路径,目标节点,目标键,目标值)
'注:若ini文件不存在则创建;节点或键不存在则添加
Function SetIniValue(path, sectionName, keyName, value)

Dim fso,file
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile(path, 1,true)

Dim line, cache, inSection, sectionExist, keyExist
Do Until file.AtEndOfStream
line = file.Readline
if StrComp(Trim(line),"["+sectionName+"]",1)=0 Then
   inSection=True
   sectionExist=True
End If
if inSection And Left(LTrim(line),1)="[" And StrComp(Trim(line),"["+sectionName+"]",1)<>0 Then
   inSection=False
   If Not keyExist Then
      cache = cache + keyName+"="+value+vbCrLf
      keyExist=True
   End If
End If

if inSection And InStr(line,"=")<>0 Then
   ss = Split(line,"=")
   If StrComp(Trim(ss(0)),keyName,1)=0 Then
      line = ss(0)+"="+value
      keyExist = True
   End If
End If

cache=cache+line+vbcrlf

Loop

file.Close

If not sectionExist Then
   cache = cache + "["+sectionName+"]"+vbCrLf
   cache = cache + keyName+"="+value+vbCrLf
ElseIf Not keyExist Then
   cache = cache + keyName+"="+value+vbCrLf
End If

Set file = fso.OpenTextFile(path, 2, True)
file.Write(cache)
file.Close

End Function

'调用
SetIniValue "C:\test.ini","Other","ccc","aaa"

原理无非就是利用处理文本的方式来处理ini,逐行读入,遇到无关行就直接存入cache,有关行则做相应处理后再存入cache,最后得到的cache就是一份完整的新ini的内容,直接把cache写入原文件,就实现了“修改”。

- 文毕 -

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AhDung

【VBS】vbs指定编码保存文本文件(含xml、ini什么的)

- 让用户填写一些信息,待安装完成后把这些信息写入软件安装目录中的指定ini、xml文件中

1101
来自专栏闻道于事

动态增加表单元素并获取元素的text和value提交

以上是效果图 需求是这样的: 专家设置好条件,然后设备检测到达到相应的条件之后,设备发出提醒给用户。 这就需要专家设置好能看懂的条件之后,然后把给专家看的,正常...

67811
来自专栏liuchengxu

Spark GraphX 对图进行可视化

Spark 和 GraphX 对并不提供对数据可视化的支持, 它们所关注的是数据处理. 但是, 一图胜千言, 尤其是在数据分析时. 接下来, 我们构建一个可视化...

2141
来自专栏IMWeb前端团队

用原生js写一个"多动症"的简历

用原生js写一个"多动症"的简历 预览地址 源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js...

4197
来自专栏非著名程序员

常见面试第四题之requestLayout, invalidate和postInvalidate的异同

requestLayout, invalidate和postInvalidate的异同 ? 今天我们来讲讲在面试当中最常见的,最常常被问到的第四题,近期由于小...

2535
来自专栏自由而无用的灵魂的碎碎念

多层次探秘Windows Vista的区域与语言选项和多语言版本问题

之前,一直想深入了解下Windows Vista Ultimate的英文版与中文版有什么详细的区别,因为Ultimate版支持多国语言。这便萌生了写这篇文章的想...

1023
来自专栏我的小碗汤

爬取珍爱网后用户信息展示

golang爬取珍爱网,爬到了3万多用户信息,并存到了elasticsearch中,如下图,查询到了3万多用户信息。

2014
来自专栏阿炬.NET

微信分享代码

5039
来自专栏漫漫前端路

关于一些Vue的文章。(7)

首先安利一波福利,有没有用vscode的小伙伴?推荐一个神奇的字体,自从用了这个字体,敲代码效率简直上天了。先上图看看效果:

1335
来自专栏用户2442861的专栏

Java Web 中使用ffmpeg实现视频转码、视频截图,javaffmpeg

http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html#!comments

5251

扫码关注云+社区

领取腾讯云代金券