1

Итак, у меня есть сценарий powershell для установки службы NServiceBus в качестве службы Windows.Захват ошибок при установке службы NServicebus в Powershell

Invoke-Expression "$fullNsbHostPath $arguments" 

Для полноты, я пытался как Invoke-Expression и Start-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 содержит код, который улавливает все исключения, затем записывает деталь исключения в консоль (stdout, а не stderr) и не устанавливает код выхода, поэтому, не разбираясь в полном выходе, я думаю, повторно застрял. –

ответ

1

Выработать на мой комментарий к OP, когда вы используете NServiceBus.Host.exe установить службу Windows, он в конечном итоге вызывает WindowsInstaller.RunInstall из NServiceBus.Hosting.Windows.Installers имен, чтобы выполнить установку:

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

Спасибо. У меня есть решение, аналогичное этому, однако надеялось избежать этого. Похоже, из ответа Энди, что то, что мне нужно, невозможно. –

+0

Я не знаю, что связано с этим продуктом. Но вы можете попробовать завершить процесс запуска с кодом выхода. Такие, как (Start-Process -FilePath "$ MSI" -ArgumentList "/ S/v/дп" -Подождите -Passthru) .ExitCode EDIT - Просто дочитать, да похоже, что это бесполезно и .. ..! –