Start-Service cmdlet:在失败的情况下获取底层错误

Start-Service cmdlet: get underlying error in case of failure

说我要启动MSSSQLSERVER服务。这是通过 Start-Service cmdlet 在 PowerShell 中完成的。
有时,服务会因为如下示例中的错误而无法启动。 我感兴趣的是失败的根本原因,而 start-service 似乎正在返回 powershell 异常,这是一个不包含 错误特定信息 的通用包装器。

PS C:\Users\Administrator> start-service MSSQLSERVER
start-service : Failed to start service 'SQL Server (MSSQLSERVER) (MSSQLSERVER)'.
At line:1 char:1
+ Start-Service MSSQLSERVER
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service],
   ServiceCommandException
    + FullyQualifiedErrorId : StartServiceFailed,Microsoft.PowerShell.Commands.StartServiceCommand

要找到问题的根本原因,我们必须求助于 net start 命令,这让我们回到了应该被 PowerShell 遗忘的过去。

C:\Users\Administrator>NET START MSSQLSERVER
The SQL Server (MSSQLSERVER) service is starting.
The SQL Server (MSSQLSERVER) service could not be started.

A service specific error occurred: 17051.

More help is available by typing NET HELPMSG 3547.

有没有办法查看服务抛出的底层错误?

我想你看看这个会很好link

但基本上,您可以使用 Try/Catch 语句并输出错误消息,如下所示:

try{
    Start-Service MSSQLSERVER -ErrorAction Stop
}catch{
    $PSItem.Exception.Message
}

I.T Delinquent所述,错误可以在异常中找到,但在这种情况下,它将存储在内部异常中:

$ErrorActionPreference = "Stop"

try
{
    Start-Service -Name "MSSQLSERVER"
}
catch
{
    $msg = @()
    $err = $_.Exception
    do {
        $msg += $err.Message
        $err = $err.InnerException
    } while ($err)

    Write-Verbose "Failed to start service: $($msg -join ' - ')"
}