2013-05-29 24 views
0

我們有MSI安裝程序生成與MSI工廠與幾個自定義操作腳本(lua & vbs)。其中一個腳本嘗試從軟件包獲取定製屬性,並在成功安裝後將其寫入文件。當通過參數請求下載時,此自定義屬性將通過在asp.net處理程序中通過MSI.ChangeMSIProperty添加到已下載的包中。問題在於,該屬性更改會釋放msi文件的簽名,因此我們嘗試將一些數據添加到msi文件名。現在我需要改變這個vbscript來處理這個問題。但我無法獲得安裝程序文件名。從自定義動作腳本獲取msi安裝程序文件名

Dim data, tokens 
Dim fso, f 
Dim setupExeFilename, setupExeFilenameParts 

data = Session.Property("CustomActionData") 
tokens = Split(data,"|") 

Set fso = CreateObject("Scripting.FileSystemObject") 

Set f = fso.CreateTextFile(tokens(0) & "\\data.txt", True) 

    if tokens(1) = "_DEFAULT_" then 
     setupExeFilename = Session.Property("SETUPEXENAME") 
     setupExeFilenameParts = Split(data,".") 
     f.Write setupExeFilenameParts(UBound(setupExeFilenameParts) - 1) 
    else 
     f.Write tokens(1) 
    end if 

f.Close 

我發現Session.Property("SETUPEXENAME")某處,但不適合我。我在Session,Session.Property,Session.ProductProperty,Installer中尋找一些屬性,但沒有運氣。我嘗試安裝程序對象,但沒有屬性返回我需要的東西。

If not Installer is nothing then 
    msgbox "Installer ok" 
    msgbox Installer.version 
end if 

是否可以獲取安裝程序文件名?

回答

1

OriginalDatabase property有你在找什麼。但是,您對CustomActionData的引用告訴我您的自定義操作正在延遲的上下文中運行。您將無法訪問此屬性。無論立即運行並序列化您的CustomActionData屬性的自定義操作都必須獲取此屬性並將其放入CustomActionData中。

您應該警告VB/JScript自定義操作以其易碎性而聞名。你提到SETUPEXENAME,所以我假設你使用的是InstallShield,因爲這是一個InstallShield屬性。我建議使用InstallScript,C/C++或C#代替。如果您選擇InstallScript,我在InstallSite.org上有一個示例CustomActionData序列化/反序列化模式。如果C#,它被內置到Microsoft.Deployment.WindowsInstaller庫的Session類中。

+0

現在我正在爲自己的問題寫答案。你是絕對正確的,OriginalDatabase是解決方案,是的,自定義操作運行在緩存的上下文:)我的解決方案是將'| [OriginalDatabase]'追加到我的CustomActionData並讀取它作爲標記(2) – sasjaq

+0

FWIW,你可以消除這個自定義操作。您可以使用不定製的自定義操作來執行文件路徑解析,並設置一組屬性,然後使用INI更改視圖以INI格式寫出它。這不會引入諸如回滾,卸載問題等問題。 –

相關問題