2013-06-04 68 views
3

我有一個WiX安裝程序,它們都可以運行SqlPackage.exe將部分已安裝的.dacpac-封裝的SQL應用程序部署到數據庫。實際部署的數據庫文件如下就會成功:WiX/MSI:將stdout重定向到文件,輸入50自定義操作

<Property Id="CONNSTRING" Value="Data Source=localhost;Integrated Security=True;Initial Catalog=MPQS-DACPAC" /> 
<Property Id="SQLPACKAGEPATH" Value="C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /> 
<CustomAction Id="DeployDatabase" Property="SQLPACKAGEPATH" 
       ExeCommand='/Action:Publish /tcs:"[CONNSTRING]" /sf:"[#My.Database.dacpac]" /p:BackupDatabaseBeforeChanges=True /p:RegisterDataTierApplication=True' 
       Return="check" Execute="deferred" Impersonate="yes" /> 

<InstallExecuteSequence> 
    <Custom Action="DeployDatabase" After="DuplicateFiles">NOT REMOVE</Custom> 
</InstallExecuteSequence> 

...我可以觀看所呈現的控制檯窗口輸出,中間安裝。

然而,它並不總是成功;例如,CONNSTRING可以在對話框中指定並且可能不正確。如果有錯誤,它們會立即出現,然後控制檯關閉,並且日誌中出現1722錯誤。

要捕獲控制檯輸出,我曾嘗試:

<CustomAction Id="DeployDatabase" Property="SQLPACKAGEPATH" 
       ExeCommand='/Action:Publish /tcs:"[CONNSTRING]" /sf:"[#My.Database.dacpac]" /p:BackupDatabaseBeforeChanges=True /p:RegisterDataTierApplication=True &gt; "[DBLogs]test.log"' 
       Return="check" Execute="deferred" Impersonate="yes" /> 

在年底&gt; "[DBLogs]test.log"應該(理論上)輸出重定向到那個位置的文件,而是安裝在此刻失敗了顯示控制檯窗口。看起來,控制檯中沒有文本顯示出來。

起腳是:我可以複製記錄與錯誤(與&gt;妥善解決,以>)命令,將其粘貼到自己的cmd窗口,它將執行和記錄。

我在做什麼錯?

而且更重要的是:我能做些什麼才能執行此命令保存stdout + stderr到一個日誌文件?

注意:我也嘗試過使用34型語法(這種方式解析爲50型)。兩者都表現出相同的行爲。

回答

1

EXE自定義操作有許多問題。閱讀:

Integration Hurdles for EXE Custom Actions

爲了解決其中的一些問題,包括標準錯誤/標準輸出,維克斯包括Quiet Execution Custom Action

+0

的說明:我最初試圖與運營商的重定向(即'「[#My.exe]」/ARGS我命令的一部分1> out.log 2>&1'),但CAQuietExec在日誌中出現'CAQuietExec:***無法識別的命令行參數'1>'。'失敗。刪除重定向後,我看到CAQuietExec登錄到MSI日誌文件,這對我的目的來說很好。 –

0

我相信有一些關於SQLPackage.exe,它以非標準的方式路由輸出(包括標準和錯誤)。從PowerShell運行SQLPackage.exe時遇到困難,並且遇到困難。不管我做了什麼,我都無法讓PowerShell捕獲SQLPackage.exe的輸出。最終,我能夠通過使用Start-Process cmdlet而不是Invoke-Expression來解決問題,以運行SQLPackage.exe,並傳入-RedirectStandardOutput $ out和-RedirectStandardError $ errorLog。通過這種方式,我至少能夠捕獲輸出,但是我確實注意到,即使發生錯誤,它也沒有與錯誤重定向一起重定向,而是被重定向到標準輸出流。我不確切知道爲什麼會發生這種情況,但它似乎與您在WiX中的結果有關。

我想了解更多關於如何將SQLPackage合併到WiX安裝中的信息。你有沒有進一步的信息可以分享,或者你有什麼資源來解決這個問題?

+0

嗨保羅 - IIRC,我要麼放棄,要麼WiX自動捕獲輸出。 : - /我會盡力疏導那個項目,看看我找到了什麼。 –

1

我有同樣的問題,我想在WIX MSI安裝過程中記錄SqlPackage.exe的輸出,所以我創建了一個WIX二進制擴展,用於處理獲取標準輸出/錯誤並將其記錄到sqlpackage文件。可執行程序。

看看https://wixdacpacinstaller.codeplex.com/

我使它免費且開源。

快速片段從文檔說明如何使用它:

<!-- first, add the binary extension. Be sure to specify the source file as WixDacPacExtension.CA.dll. --> 
<Binary 
    Id="WixDacPacExtensionBinary" 
    SourceFile="<Path to your file>\WixDacPacExtension.CA.dll"/> 

<!-- Create a custom action to run first and set up all the parameters that are --> 
<!-- passed to the Wix DacPac Extension. The property name MUST MATCH --> 
<!-- the name of the custom action that executes the binary defined above. --> 
<!-- The parameters in the Value property are semi-colon delimited. --> 
<CustomAction 
    Id="SetupDacPacWIXDacPacInstallerExampleCustomAction" 
    Property="DacPacWIXDacPacInstallerExampleCustomAction" 
    Value="ShowUI=True;SqlPackagePath=c:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin\SqlPackage.exe;DacPacPath=[INSTALLFOLDER]WIXDacPacInstallerExample.dacpac;LogFilePath=[TempFolder]\WIXDacPacInstallerExample.dacpac.log;TargetServerName=[DATABASESERVER];TargetDatabaseName=WIXDacPacInstallerExample;OtherParameters=/p:RegisterDataTierApplication=True /p:BlockWhenDriftDetected=False /p:BlockOnPossibleDataLoss=False" 
     /> 

<!-- 
    This custom action will execute the extension with the parameters from Step #1. 
    NOTE: the Id of this custom action matches the Property of the custom action 
      from Step #1. 
--> 
<CustomAction 
    Id="DacPacWIXDacPacInstallerExampleCustomAction" 
    BinaryKey="WixDacPacExtensionBinary" 
    DllEntry="Execute" 
    Execute="deferred" 
    Return="check" 
/> 
+0

不錯!感謝您接受建議 - 我會刪除我的舊評論,然後是這一個,這樣您的答案就乾淨了。乾杯! – Mogsdad