【vbs】vbs写ini文件
這兩天在折騰給一個(gè)項(xiàng)目打安裝包,第一次接觸軟件打包,用的Advanced Installer(以下簡(jiǎn)稱AI),應(yīng)該說如果安裝過程沒有特殊動(dòng)作(常規(guī)動(dòng)作指釋放文件、寫注冊(cè)表、建快捷方式等)的話,倒挺傻瓜的,按照向?qū)Ш徒缑娌僮骶湍艽蚝靡粋€(gè)包。但我的安裝動(dòng)作包括:
- 提供一個(gè)ComboBox列出已安裝打印機(jī)讓用戶選擇
- 讓用戶填寫一些初始參數(shù)并在安裝完成后把這些參數(shù)寫入安裝目錄中的指定ini和xml文件中
第一個(gè)需求就折騰了我大半天,難點(diǎn)在于動(dòng)態(tài)填充ComboBox項(xiàng),資料和文檔不好找,又是E文,好在天道酬勤,愣是讓我在官方論壇中刨到有用的帖子,總算搞掂,或者我會(huì)另開一文說說如何做的,以助后來(lái)者。
接下來(lái)就是獲取用戶的輸入,然后寫入指定ini和xml中。AI可以自由發(fā)揮的途徑個(gè)人認(rèn)為不算少,它的自定動(dòng)作(Custom Actions)可以調(diào)用exe/js/vbs等東東,但js和vbs我沒什么底子,有點(diǎn)畏難情緒,想用自己熟悉的方式來(lái)解決問題,就是用c#寫個(gè)exe,通過main函數(shù)傳參,把參數(shù)寫入ini和xml~很容易的事。但仔細(xì)想想,一來(lái),.net程序依賴CLR,雖說安裝過程可以指定必要組件,強(qiáng)制用戶把.net裝好,不用擔(dān)心執(zhí)行到該.net程序時(shí)缺乏運(yùn)行環(huán)境,但總感覺在安裝包中嵌入.net程序好像不太地道,再有.net程序首次運(yùn)行需喚醒CLR,我安裝過程求的就是順暢,為了一個(gè)簡(jiǎn)單任務(wù)就要等待CLR啟動(dòng),即便只是一兩秒,也是我不能忍受的;二來(lái),即便我有信心短時(shí)間內(nèi)學(xué)會(huì)另一門非托管語(yǔ)言(delphi/c++啥的)來(lái)完成這個(gè)簡(jiǎn)單任務(wù),但exe體積也必然會(huì)大大超過腳本的,這會(huì)增大整個(gè)安裝包的體積,沒必要。所有思來(lái)想去,還是決定搞一搞vbs。
只是他娘的,用慣優(yōu)雅的C#,感覺其它語(yǔ)言就像屎一樣,更別說像vbs這種腳本還沒什么像樣的ISE,總之很佩服主要coding在這些語(yǔ)言上的碼農(nóng)們,完全是受虐。whatever~一開始本來(lái)想找找vbs調(diào)用win32 API的方法,如果可以的話,那調(diào)一調(diào)WritePrivateProfileString就完事了,可找來(lái)找去,發(fā)現(xiàn)似乎vbs不能直接調(diào)API(沒找到官方說法,故暫存疑),網(wǎng)上高人的辦法有二:一是用vbs調(diào)用office的vba組件,再操作vba來(lái)調(diào)用api~真叫一個(gè)迂回,同時(shí)也感嘆高人的智慧吶;二是往系統(tǒng)中扔一個(gè)dynwrap.dll就可以調(diào)了,話說這dll的出處還頗為神秘,搜不到,文件信息和內(nèi)容也沒看出什么端倪,人作者這才是真雷鋒啊。anyway,上述方法對(duì)于我做安裝包來(lái)說,萬(wàn)萬(wàn)不能考慮,所以,還是老實(shí)研究地道vbs法,小有成果,分享如下:
'函數(shù):設(shè)置ini值(ini路徑,目標(biāo)節(jié)點(diǎn),目標(biāo)鍵,目標(biāo)值) '注:若ini文件不存在則創(chuàng)建;節(jié)點(diǎn)或鍵不存在則添加 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 TheninSection=TruesectionExist=True End If if inSection And Left(LTrim(line),1)="[" And StrComp(Trim(line),"["+sectionName+"]",1)<>0 TheninSection=FalseIf Not keyExist Thencache = cache + keyName+"="+value+vbCrLfkeyExist=TrueEnd If End Ifif inSection And InStr(line,"=")<>0 Thenss = Split(line,"=")If StrComp(Trim(ss(0)),keyName,1)=0 Thenline = ss(0)+"="+valuekeyExist = TrueEnd If End Ifcache=cache+line+vbcrlfLoopfile.CloseIf not sectionExist Thencache = cache + "["+sectionName+"]"+vbCrLfcache = cache + keyName+"="+value+vbCrLf ElseIf Not keyExist Thencache = cache + keyName+"="+value+vbCrLf End IfSet file = fso.OpenTextFile(path, 2, True) file.Write(cache) file.CloseEnd Function'調(diào)用 SetIniValue "C:\test.ini","Other","ccc","aaa"原理無(wú)非就是利用處理文本的方式來(lái)處理ini,逐行讀入,遇到無(wú)關(guān)行就直接存入cache,有關(guān)行則做相應(yīng)處理后再存入cache,最后得到的cache就是一份完整的新ini的內(nèi)容,直接把cache寫入原文件,就實(shí)現(xiàn)了“修改”。
- 文畢 -
posted on 2014-08-11 13:21 ahdung 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/ahdung/p/3904528.html
總結(jié)
以上是生活随笔為你收集整理的【vbs】vbs写ini文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在HTML文件中加载js
- 下一篇: iOS的runtime运行时机制