【问题标题】:Try/Catch Script Failing to output $error to fileTry/Catch 脚本无法将 $error 输出到文件
【发布时间】:2022-08-18 14:52:40
【问题描述】:

我正在编写一个脚本,它将执行以下操作:

  1. 检查服务(在本例中为 XboxGipSvc)是否正在运行
  2. 如果服务正在运行,什么也不做
  3. 如果服务未运行,请尝试启动服务
  4. 如果服务启动失败,捕获错误并记录到 C:\\TEMP\\RemediationLog.log

    我相信我已经正确地完成了我的 try/catch 块,但是即使我在运行 try 块时遇到错误,它也不会按预期将 $error 记录到文件中。

    这是我的代码:

    $Error.Clear()
    
    try{
        $Airlock1 = Get-Service -Name XboxGipSvc -ErrorAction Stop
            while ($Airlock1.Status -ne \"Running\"){
                                                                    Start-Service $Airlock1 -ErrorAction Stop
                                                                    Write-Host $Airlock1.Status
                                                                    Write-Host \"Service is Starting\"
                                                                    Start-Sleep -Seconds 5
                                                                    $Airlock1.Refresh()
                                                                    if ($Airlock1.Status -eq \"Running\"){Write-Host \"Service is now running\"}
                                                                }
       }
    catch [Microsoft.PowerShell.Commands.StartServiceCommand]{
                                                                    {     
                                                                        if ($error -ne $null)
                                                                            {
                                                                                $test = Test-Path -path C:\\TEMP\\RemediationLog.log
                                                                                if ($test -eq $false){New-Item -Path C:\\TEMP\\RemediationLog.log}
                                                                                $error | Out-File -FilePath C:\\TEMP\\RemediationLog.log -Force -Append
                                                                                Write-Host $error.Exception[0]
                                                                            }
                                                                    }
                                                             }
    
  • 几个观察。我相信你的捕获应该是异常类型[Microsoft.PowerShell.Commands.ServiceCommandException]if ($error -ne $null) 应该反转为 if ($null -ne $error) 或只是 if ($error) 但是这个 if 语句完全不需要,因为我们知道有一个错误,因为我们毕竟在一个 catch 块中。

标签: powershell try-catch powershell-ise


【解决方案1】:

此外@Daniel有用的评论:

Accessing exception information

catch 块内,可以使用$_(也称为$PSItem)访问当前错误。该对象的类型为ErrorRecord

$Error

$Errorautomated variable 中,其中包含数组错误对象代表最近的错误。最近的错误是数组$Error[0] 中的第一个错误对象。

这意味着您可能只想使用 Catch 块中的当前项 ($_) 并将所有错误信息格式化为一行。就像是:

$ErrorMessage = '{0} at {1}:{2} char: {3}' -f
    $_.exception.Message,
    $_.InvocationInfo.ScriptName,
    $_.InvocationInfo.ScriptLineNumber,
    $_.InvocationInfo.OffsetInLine
$ErrorMessage |Out-File -FilePath C:\TEMP\RemediationLog.log -Force -Append

(请注意,这与较新的PowerShell (Core) 版本的错误输出格式类似)

对于你尝试过的

"它没有按预期将 $error 记录到文件中'
您期望什么,您体验到的实际输出是什么?
请注意,输出可能会因 PowerShell 版本而异,但应该与您在 PowerShell 提示符下键入 $Error 时显示的内容相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多