1

NServicebus服務時,所以,我有一個PowerShell腳本安裝一個NServiceBus服務作爲Windows服務。捕獲錯誤安裝在PowerShell中

Invoke-Expression "$fullNsbHostPath $arguments" 

爲了完整起見,我都試過Invoke-ExpressionStart-Process

Start-Process -Wait -NoNewWindow -FilePath $fullNsbHostPath -ArgumentList $arguments -RedirectStandardOutput $tempFileName -ErrorVariable $errvar 

它會調用安裝就好了,這在某些情況下報告異常例如:

Failed to execute installers: System.Data.SqlClient.SqlException 
(0x80131904): A connection was successfully established with the 
server, but then an error occurred during the login process. 
(provider: Shared Memory Provider, error: 0 - No process is on the 
other end of the pipe.) ---> System.ComponentModel.Win32Exception 
(0x80004005): No process is on the other end of the pipe ... Error 
.... 
Number:233,State:0,Class:20 

我對此感到滿意。我想預計的例外。然而,這個過程本身並沒有表明它失敗了。的確,Powershell腳本本身成功完成。

我可以解析爲一個錯誤代碼或者一些「例外」文本輸出文本,但這似乎可悲的不盡人意。

我不認爲這是一個PowerShell的問題。當我通過命令行運行它並檢查%errorlevel%時,我得到0。此外,其他幾個執行相同操作的示例聯機腳本也會忽略任何錯誤傳播。

有什麼建議嗎?

+0

NServiceBus.Host.exe包含捕獲所有的異常,然後異常詳細信息寫入控制檯(標準輸出,而不是標準錯誤),不設置退出代碼,這麼短解析所有輸出的代碼,我想你」重新卡住了。 –

回答

1

要闡述我到OP評論,當您使用NServiceBus.Host.exe安裝一個Windows服務,它最終從NServiceBus.Hosting.Windows.Installers命名空間調用WindowsInstaller.RunInstall來執行安裝:

private static void RunInstall() 
{ 
    Console.WriteLine("Executing the NServiceBus installers"); 
    try 
    { 
     WindowsInstaller.host.Install(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Failed to execute installers: " + ex); 
    } 
} 

如您所見,此方法捕獲安裝過程中的所有異常並將它們寫入控制檯標準輸出流。它不會寫入錯誤輸出流(Console.Error)或設置退出代碼(Environment.ExitCode),所以您唯一的選擇是解析應用程序的標準輸出。

+0

這是垃圾!也許提出一個錯誤!哪個版本的NServicebus?我有興趣看看他們是否已經在5或更高版本中解決了這個問題。 –

+1

這至少適用於NServiceBus 3.3 - 5.0。 –

+2

我懷疑這是一個錯誤。我在這裏提出了一個問題https://github.com/Particular/NServiceBus.Host/issues/112,對於任何犛牛刮這造成了你的歉意cc @JamesWiseman – Simon

1

的要求我會運行在錯誤日誌

快速和骯髒......編輯檢查。

$logfile = 'logfilelocation' 
$Complete = 'no' 
$Counter = 1 
$max = 6 

    DO { 

    $Check = SELECT-STRING -pattern 'status: 0.' -path $logfile -quiet 
    write-host $Check 
    If (($Check) -eq $True) { 
    Set-Variable -name Complete -Value "yes" 
     } 
      Else {Set-Variable -name Complete -Value 'no'} 
       Write-host $Counter 
       Start-Sleep 20 
       $Counter++ 
          } 

      while ($Complete -eq 'no') 

       If (($Counter) -eq $max) { 

    Throw 'Installation failed, check the error log' 

     } 
+0

謝謝。我有類似的解決方案,但希望避免這種情況。從Andy的回答看來,我所追求的是不可能的。 –

+0

我不知道涉及的產品。但是你可以嘗試用退出代碼封裝啓動進程。 如 (開始處理-FilePath 「$ MSI」 -ArgumentList 「/ S/V/QN」 -Wait -passThru).ExitCode 編輯 - 剛剛看了起來,是啊看起來是無用也.. ..! –