2014-02-17 53 views
2

我有一個VBScript這需要輸入文件名讀取數據

代碼

Dim tsout: Set tsout = gofs.CreateTextFile("C:\....csv") 
Dim tsin: Set tsin = gofs.OpenTextFile("C:\.....csv") 

我如何能配置,從而使路徑createTextFile(....)從配置文件(.ini

閱讀

用於創建和寫入輸出的文件路徑必須取自ini文件

這是我的ini文件

//我的ini文件

[Read_file] 
tsout=E:.....tt.csv 
tsin=E:\....gt.csv 

    [col] 
Number1=4 
Number2=5 

回答

7

的.ini文件分析器的一個簡單的版本:

Option Explicit 

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") 

'WScript.Quit demoReadFile() 
WScript.Quit demoReadIniFile() 

Function demoReadFile() 
    demoReadFile = 0 
    Dim tsIn : Set tsIn = goFS.OpenTextFile(".\21825192.ini") 
    Do Until tsIn.AtEndOfStream 
    Dim sLine : sLine = tsIn.ReadLine() 
    WScript.Echo tsIn.Line - 1, sLine 
    Loop 
    tsIn.Close 
End Function 

Function demoReadIniFile() 
    demoReadIniFile = 0 
    Dim dicIni : Set dicIni = ReadIniFile(".\21825192.ini") 
    Dim sSec, sKV 
    For Each sSec In dicIni.Keys() 
     WScript.Echo "---", sSec 
     For Each sKV In dicIni(sSec).Keys() 
      WScript.Echo " ", sKV, "=>", dicIni(sSec)(sKV) 
     Next 
    Next 
    WScript.Echo dicIni("tsout")("Path") 
End Function 

Function ReadIniFile(sFSpec) 
    Dim dicTmp : Set dicTmp = CreateObject("Scripting.Dictionary") 
    Dim tsIn : Set tsIn = goFS.OpenTextFile(sFSpec) 
    Dim sLine, sSec, aKV 
    Do Until tsIn.AtEndOfStream 
    sLine = Trim(tsIn.ReadLine()) 
    If "[" = Left(sLine, 1) Then 
     sSec = Mid(sLine, 2, Len(sLine) - 2) 
     Set dicTmp(sSEc) = CreateObject("Scripting.Dictionary") 
    Else 
     If "" <> sLine Then 
      aKV = Split(sLine, "=") 
      If 1 = UBound(aKV) Then 
       dicTmp(sSec)(Trim(aKV(0))) = Trim(aKV(1)) 
      End If 
     End If 
    End If 
    Loop 
    tsIn.Close 
    Set ReadIniFile = dicTmp 
End Function 

輸出:

cscript 21825192.vbs 
1 [pipapo] 
2 Path=E:\dont\find\me.csv 
3 Some = thing else 
4 
5 [tsout] 
6 Path=E:\where\ever\output.csv 
7 abc=def 

cscript 21825192.vbs 
--- pipapo 
    Path => E:\dont\find\me.csv 
    Some => thing else 
--- tsout 
    Path => E:\where\ever\output.csv 
    abc => def 
E:\where\ever\output.csv 

(見背景)

更新WRT評論/編輯:

我加了你的部分s到我的樣本.ini文件:

type 21825192.ini 
[pipapo] 
Path=E:\dont\find\me.csv 
    Some = thing else 

[tsout] 
Path=E:\where\ever\output.csv 
abc=def 

[Read_file] 
tsout=E:.....tt.csv 
tsin=E:\....gt.csv 

    [col] 
Number1=4 
Number2=5 

和 - 只是爲了清楚起見 - 改變了我的demoReadIniFile()函數的最終輸出線:

WScript.Echo "tsout.Path", dicIni("tsout")("Path") 
    WScript.Echo "Read_file.tsin", dicIni("Read_file")("tsin") 
    WScript.Echo "col.Number2", dicIni("col")("Number2") 

輸出:

cscript 21825192.vbs 
--- pipapo 
    Path => E:\dont\find\me.csv 
    Some => thing else 
--- tsout 
    Path => E:\where\ever\output.csv 
    abc => def 
--- Read_file 
    tsout => E:.....tt.csv 
    tsin => E:\....gt.csv 
--- col 
    Number1 => 4 
    Number2 => 5 
tsout.Path E:\where\ever\output.csv 
Read_file.tsin E:\....gt.csv 
col.Number2 5 

所以我完全不理解爲什麼訪問'col1節取出number1 = 4和Number2 = 5'會導致任何問題。

+0

這對我來說非常棒!值得注意的一件事(可能會讓某些人頭疼):如果在.ini文件中使用製表符而不是空格,則會出現問題。在密鑰名稱和等號之間使用空格,或者根本不使用空格。 –

+0

注意:上面的ReadIniFile()函數與PHP讀取它們的方式並不完全相關。上面的內容會讀取分號以外的內容,PHP會將其作爲忽略註釋的開始。如果用引號括起來,PHP將採用包含分號的整個字符串;但ASP將自己讀取引號作爲值的一部分.. –

0

VBS不支持ini文件類。您需要創建自己的INI文件解析器。其他解決方案(也可以創建自己的解析函數,但比解析INI文件要容易得多):保存TAB分隔數據,例如:首先將OUTgoing文件比TAB字符比INcomming文件。

0

Ekkehard的演示調整了傳統的ASP:

Function demoReadIniFile() 
    demoReadIniFile = 0 
    Dim dicIni : Set dicIni = ReadIniFile("c:\path\to\21825192.ini") 
    Dim sSec, sKV 
    For Each sSec In dicIni.Keys() 
     response.write "---" & sSec & "<br>" 
     For Each sKV In dicIni(sSec).Keys() 
      response.write " " & sKV & " => " & dicIni(sSec)(sKV) & "<br>" 
     Next 
    Next 
' response.write dicIni("tsout")("Path") & "<br>" 
End Function 

他ReadIniFile()按寫入。