1

因此,我有一个 powershell 脚本来将 NServiceBus 服务安装为 Windows 服务。

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. 此外,其他几个执行相同操作的示例在线脚本也省略了任何错误传播。

有什么建议么?

4

2 回答 2

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'

        } 
于 2016-11-18T10:33:15.503 回答
1

为了详细说明我对 OP 的评论,当您使用 NServiceBus.Host.exe 安装 Windows 服务时,它最终会WindowsInstaller.RunInstallNServiceBus.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),因此您唯一的选择是解析应用程序的标准输出。

于 2016-11-18T11:02:15.253 回答