1

WindowsサービスとしてNServiceBusサービスをインストールするためのpowershellスクリプトがあります。PowershellにNServicebusサービスをインストールするときにエラーが発生する

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 

私はこれに満足しています。 I は例外であると予想します。ただし、プロセス自体は、失敗したことを示すものではありません。確かに、Powershellスクリプト自体は正常に完了します。

エラーコードまたは多少の「例外」テキストの出力テキストを解析することができましたが、これは残念ながら不満足なようです。

私はこれがPowershellの問題ではないと思います。私がコマンドラインで単に実行し、%errorlevel%を調べると、0が得られます。さらに、同じことをするいくつかの他のオンラインスクリプトの例では、エラー伝搬も省略されています。

提案がありますか?

+0

NServiceBus.Host.exeには、すべての例外をキャッチしてコンソール(stderrではなくstdout)に書き出し、終了コードを設定しないコードが含まれているため、すべての出力を解析していないと、再詰まった。 –

答えて

1

ご覧のとおり、このメソッドはインストールプロセスからのすべての例外をキャッチし、コンソール標準出力ストリームに書き込みます。エラー出力ストリーム(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

エラーログのチェックを実行します。

クイックで汚れています...必要に応じて編集してください。

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

:WindowsサービスをインストールするNServiceBus.Host.exeを使用する場合、それは最終的にインストールを実行するためにNServiceBus.Hosting.Windows.Installers名前空間からWindowsInstaller.RunInstallを呼び出し、OPに私のコメントについては詳しく説明し

$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) EDITを.ExitCode - ちょうど読んで、それも役に立たないように見えるええ.. ..! –

関連する問題