Powershell -ErrorAction Silently继续不向 $Error 变量添加错误

问题描述 投票:0回答:3

我希望在我遇到的问题上得到一些帮助,一旦我将 -ErrorAction SilentlyContinue 添加到我的命令中,就不会向 $Error 变量写入任何错误。当我删除 ErrorAction 时,该命令工作得很好,我可以看到 $Error 变量中的错误,但错误也会打印到控制台,这是我不想要的。添加 ErrorAction 后,该命令仍然有效,但不会将任何错误写入 $Error 变量。

下面是包含该命令的函数。

function removebutton{
    Try{
        Write-Host "Please Wait..."
        Import-CSV $WPFfile_path.Text | foreach{Remove-DistributionGroupMember -Identity $WPFlist_email.Text -Member $_.email -Confirm:$false -ErrorAction SilentlyContinue}
        Write-Host("Completed Processing List")
        [System.Windows.MessageBox]::Show("Completed Processing List")       
            If ($error -ne $null) 
            {
            Write-Host -ForegroundColor Red ($Error | Select-Object Exception -ExpandProperty Exception | Out-String)
            [System.Windows.MessageBox]::Show(($Error | Select-Object Exception -ExpandProperty Exception | Out-String))
            }
            Else 
            {
            }
        Get-DistributiongroupMember $WPFlist_email.Text | Select-Object DisplayName, PrimarySMTPAddress | Out-GridView
        }
    Catch{
        [System.Windows.MessageBox]::Show(($Error[0]))
        }
        }

任何帮助将不胜感激!

亲切的问候, 灰尘

当我删除 ErrorAction 时,该命令运行得很好,我可以看到 $Error 变量中的错误,但错误也会打印到控制台,这是我不想要的。添加 ErrorAction 后,该命令仍然有效,但不会将任何错误写入 $Error 变量。

powershell error-handling
3个回答
3
投票

注:

  • 以下描述了 PowerShell 的正常行为。
  • 事实证明,Remove-DistributionGroupMember
    中的一个
    明显的错误
    阻止了在存在
    $Error
    的情况下在
    -ErrorAction SilentlyContinue
    中记录非终止错误,由于未知的原因,可以通过使用2>$null绕过
     
    改为静音错误输出。

  • -ErrorAction
    SilentlyContinue
    继续自动$Error变量
    中记录
    非终止
    错误(只有
    -ErrorAction Ignore
    不会)。

    • 不要使用If ($Error -ne $null)

      来测试最近的语句中是否发生错误
      ,因为$Error
      包含迄今为止在会话中
      中发生的所有错误。

      顺便说一句:
        要测试
      • $null 的值,请将其放在
        -eq
        / -ne
        LHS
         上,因为这些运算符充当 
        filters
        ,其中 collections(数组)作为LHS - 请参阅文档
    • 相反,请使用

      自动$?变量

      if (-not $?)
      
      

    • 但是,
    非终止
  • 错误 - 这是
  • 常见

    -ErrorAction参数独占

    的作用 - 
    触发catch语句块
    try ... catch ... finally
    - 仅终止
    错误确实如此。
    您可以使用 -ErrorAction Stop

      非终止错误提升为终止错误,从而使它们也触发
    • catch 块。
      
      
      请注意,在 
    • catch
    脚本块中,您可以通过
  • automatic
  • $_

    变量

    更简单地引用触发错误;也就是说,您可以使用 
    $Error[0] 来代替
    $_
    
    
    有关 PowerShell 极其复杂的错误处理的全面概述,请参阅 

    GitHub 文档问题 #1583

令人惊讶的是,用 -ErrorAction SilentlyContinue

替换

0
投票
解决了我的问题。错误不再写入控制台,而仅写入 $Error 变量。

感谢@mklement0 的帮助!非常感激!我给你买了一杯咖啡来表示感谢!

重定向到 2>$null 并不总是能抑制错误。例如,如果您运行以下命令,它将捕获错误并将其显示在控制台中:

$Error.Clear() Add-Type -Path 'NonExisting.dll' -ErrorAction Stop 2>$Null $Error[0]

0
投票
输出:

Add-Type : Cannot bind parameter 'Path' to the target. Exception setting "Path": "Cannot find path 'C:\Users\Admin\NonExisting.dll' because it does not exist." At line:2 char:21 + Add-Type -Path 'NonExisting.dll' -ErrorAction Stop 2>$Null + ~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (:) [Add-Type], ParameterBindingException + FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.AddTypeCommand Add-Type : Cannot bind parameter 'Path' to the target. Exception setting "Path": "Cannot find path 'C:\Users\Admin\NonExisting.dll' because it does not exist." At line:2 char:21 + Add-Type -Path 'NonExisting.dll' -ErrorAction Stop 2>$Null + ~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (:) [Add-Type], ParameterBindingException + FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.AddTypeCommand
您可以通过以下方式运行来捕获错误并抑制控制台中的错误消息:

$Error.Clear() .{Add-Type -Path 'NonExisting.dll' -ErrorAction Stop} 2>$Null $Error[0]
输出:

Add-Type : Cannot bind parameter 'Path' to the target. Exception setting "Path": "Cannot find path 'C:\Users\Admin\NonExisting.dll' because it does not exist." At line:2 char:21 + Add-Type -Path 'NonExisting.dll' -ErrorAction Stop 2>$Null + ~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (:) [Add-Type], ParameterBindingException + FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.AddTypeCommand
    

© www.soinside.com 2019 - 2024. All rights reserved.