2012-07-12 43 views
0

我們已經使用wix來創建Msi。每個Msi將具有1或2或3個功能,例如Appserver功能,Web服務器功能和數據庫服務器功能。從Msi,如何獲取包含在每個功能中的文件列表?

現在我被要求獲取每個功能中提供的配置文件列表。

很難通過wxs文件找到與每個功能相關的web.config文件列表。

是否有可能找到與特定搜索模式相關聯的文件列表?

例如,查找包含在Appserver功能中的所有web.config文件。

有沒有什麼辦法簡單的方法(查詢或一些其他自動化腳本,如PowerShell)來獲取列表?

回答

1

Wix附帶一個稱爲DTF(「部署工具基礎」)的.NET SDK。它包裹着窗戶msi.dll等等。您可以在Wix Toolset安裝目錄的SDK子目錄中找到這些.NET Microsoft.Deployment.*.dll程序集。文檔位於doc子目錄中的dtf.chmdtfapi.chm

如文檔中所示,您可以使用此SDK編寫使用SQL查詢msi數據庫的代碼。您將對Feature,FeatureComponentsFile表感興趣。

如果您之前沒有探索過MSI的內部組件,您可以使用orca打開它以感受它。

0

您可以通過對Get-MsiProperties function described in this PowerShell article稍做修改來完成此操作。

請閱讀原文並創建規定的comObject.types.ps1xml文件。

function global:Get-MsiFeatures { 
    PARAM (
     [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,HelpMessage="MSI Database Filename",ValueFromPipeline=$true)] 
     [Alias("Filename","Path","Database","Msi")] 
     $msiDbName 
    ) 

    # A quick check to see if the file exist 
    if(!(Test-Path $msiDbName)){ 
     throw "Could not find " + $msiDbName 
    } 

    # Create an empty hashtable to store properties in 
    $msiFeatures = @{} 

    # Creating WI object and load MSI database 
    $wiObject = New-Object -com WindowsInstaller.Installer 
    $wiDatabase = $wiObject.InvokeMethod("OpenDatabase", (Resolve-Path $msiDbName).Path, 0) 

    # Open the Property-view 
    $view = $wiDatabase.InvokeMethod("OpenView", "SELECT * FROM Feature") 
    $view.InvokeMethod("Execute") 

    # Loop thru the table 
    $r = $view.InvokeMethod("Fetch") 
    while($r -ne $null) { 
     # Add property and value to hash table 
     $msiFeatures[$r.InvokeParamProperty("StringData",1)] = $r.InvokeParamProperty("StringData",2) 

     # Fetch the next row 
     $r = $view.InvokeMethod("Fetch") 
    } 

    $view.InvokeMethod("Close") 

    # Return the hash table 
    return $msiFeatures 
} 
相關問題