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