这两天在折腾给一个项目打安装包,第一次接触软件打包,用的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, ,true) Dim line, cache, inSection, sectionExist, keyExist
Do Until file.AtEndOfStream
line = file.Readline
if StrComp(Trim(line),"["+sectionName+"]",)= Then
inSection=True
sectionExist=True
End If
if inSection And Left(LTrim(line),)="[" And StrComp(Trim(line),"["+sectionName+"]",)<> Then
inSection=False
If Not keyExist Then
cache = cache + keyName+"="+value+vbCrLf
keyExist=True
End If
End If if inSection And InStr(line,"=")<> Then
ss = Split(line,"=")
If StrComp(Trim(ss()),keyName,)= Then
line = ss()+"="+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, , True)
file.Write(cache)
file.Close End Function '调用
SetIniValue "C:\test.ini","Other","ccc","aaa"

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

- 文毕 -

【vbs】vbs写ini文件的更多相关文章

  1. C#读取ini文件的方法

    最近项目用到ini文件,读取ini文件,方法如下: using System; using System.Collections.Generic; using System.Linq; using S ...

  2. WPF操作ini 文件的读写示例

    /// <summary> /// IniFiles 的摘要说明. /// 示例文件路径:C:\file.ini /// [Server] //[*] 表示缓存区 /// name=loc ...

  3. 【代码】ini 文件读取工具类

    using System; using System.Runtime.InteropServices; using System.Text; namespace hrattendance.Common ...

  4. winform INI文件操作辅助类

    using System;using System.Runtime.InteropServices;using System.Text; namespace connectCMCC.Utils{ // ...

  5. VB读写INI文件的四个函数以及相关API详细说明

    WritePrivateProfileString函数说明  来源:http://blog.csdn.net/wjb9921/article/details/2005000 在我们写的程序当中,总有一 ...

  6. C#- 操作Ini文件

    以前习惯了使用.NET中的WEB.CONFIG或者APP.CONFIG,最近在做项目的时候遇到了些问题,发现没办法使用这些CONFIG文件.一开始我的做法是建一个文本文件,自己定规律,自己写方法去写新 ...

  7. [IO] C# INI文件读写类与源码下载 (转载)

    /// <summary> /// 类说明:INI文件读写类. /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:[url]http://www.sufei ...

  8. C# 读写INI 文件

    INI 格式: [Section1] KeyWord1 = Value1 KeyWord2 = Value2 ... [Section2] KeyWord3 = Value3 KeyWord4 = V ...

  9. C# Ini文件操作

    在开源中国看到的操作ini文件的,写的还不看,留着以后用 using System; using System.IO; using System.Runtime.InteropServices; us ...

随机推荐

  1. REST建模语言RAML介绍

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   RAML是什么?   RAML是一种简洁的RESTful API描述性语言,它基于 YAML和JSON这样的公 ...

  2. php做登录注册页面及加载

    //SQL注入攻击 //1.过滤用户的输入 //2.使用预处理语句 //3.写代码的时候尽量避免 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  3. ASP.net的指令

    3.2 ASP.NET指令 在基于面向对象思想的.NET平台,可以称之为“万物皆对象”了.在这里,一个页面,一个用户控件,一个母版页等,全都是对象,全都有各自的属性. 在类文件里,我们表示类的属性可以 ...

  4. Atitit 破解qq空间(2)-------探测权限

    Atitit 破解qq空间(2)-------探测权限 /AtiPlatf_cms/src/com/attilax/net/httpTest.java  package com.attilax.net ...

  5. 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木

           学习JAVA不难,难的是没有多余的时间给你仔细学习.       伴随着项目的不断跟进,责任重于泰山,必须快速提升.       我不能期望把一本书或者一个项目完全吃透,只希望能用数量去 ...

  6. angularjs decorator

    angularjs decorator https://docs.angularjs.org/guide/decorators decorator() $provide服务提供了在服务实例创建时对其进 ...

  7. POJ3069 POJ2586 解题报告(异曲同工的贪心算法)

    [POJ 3069](2586见下) 原题在此:http://poj.org/problem?id=3069 题目大意: 一个直线上有N个点.点i的距离是Xi.从这些点中选取若干个加上标记.要求:对于 ...

  8. .NET 程序启动调试器 .NET 测试代码耗费时间

    有些场景的.NET程序,不容易设置断点,可以用下面的方法,在.NET代码中增加启动调试器的代码: if (!Debugger.IsAttached) Debugger.Launch(); .cshar ...

  9. Oracle 11g系列:函数与存储过程

    1.函数 Oracle中的函数分为两类:系统函数和自定义行数.对于自定义函数,函数的传入参数可以没有,如果有,一定要明确其数据类型.函数传入参数不能在函数内部进行修改.函数必须有返回值,并且返回值必须 ...

  10. Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...