0

问题

使用-ErrorAction "SilentlyContinue"时,错误变量未按照以下文档中的说明进行填充:以 PowerShell 方式处理错误

问题

如何防止错误按原样显示-ErrorAction "Continue"但仍填充错误变量?

奖金问题

有没有办法将错误附加到错误变量以存储多个错误?

MWE

脚本

$ErrorActions = @("Continue", "SilentlyContinue", "Stop")
foreach ($ErrorAction in $ErrorActions) {
    Write-Host -Object $ErrorAction -ForegroundColor "Green"
    Get-Item -Path "C:\tmp\error1" -ErrorAction $ErrorAction -ErrorVariable "ErrorMessage"
    Get-Item -Path "C:\tmp\error2" -ErrorAction $ErrorAction -ErrorVariable "ErrorMessage"
    Write-Host -Object "ErrorVariable" -ForegroundColor "Yellow"
    $ErrorMessage
}

输出

继续

Get-Item:找不到路径“C:\tmp\error1”,因为它不存在。

在 C:\tmp\mwe.ps1:43 字符:5

  • Get-Item -Path "C:\tmp\error1" -ErrorAction $ErrorAction -ErrorVa ...
    
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : ObjectNotFound: (C:\tmp\error1:String) [Get-Item], ItemNotFoundException

    • FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand

Get-Item:找不到路径“C:\tmp\error2”,因为它不存在。

在 C:\tmp\mwe.ps1:44 字符:5

  • Get-Item -Path "C:\tmp\error2" -ErrorAction $ErrorAction -ErrorVa ...
    
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : ObjectNotFound: (C:\tmp\error2:String) [Get-Item], ItemNotFoundException

    • FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand

误差变量

Get-Item:找不到路径“C:\tmp\error2”,因为它不存在。

在 C:\tmp\mwe.ps1:44 字符:5

  • Get-Item -Path "C:\tmp\error2" -ErrorAction $ErrorAction -ErrorVa ...
    
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : ObjectNotFound: (C:\tmp\error2:String) [Get-Item], ItemNotFoundException

    • FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand

默默地继续

误差变量

停止

Get-Item:找不到路径“C:\tmp\error1”,因为它不存在。

在 C:\tmp\mwe.ps1:43 字符:5

  • Get-Item -Path "C:\tmp\error1" -ErrorAction $ErrorAction -ErrorVa ...
    
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : ObjectNotFound: (C:\tmp\error1:String) [Get-Item], ItemNotFoundException

    • FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand

4

1 回答 1

1

使用Get-ChildItem为例:

Get-ChildItem C:\nonexist -EA SilentlyContinue -EV silentErr
[bool]$silentErr # ==> True

正如您链接到的文档所提到的,当发生非终止错误时(这些影响终止错误-ErrorVariable)并控制以下行为:$ErrorActionPreference

  • Continue:显示错误并继续执行。
  • SilentlyContinue: 隐藏错误但仍将其添加到-ErrorVariable(如果指定)和$error堆栈中。
  • Stop: 抛出异常并停止执行。可以通过 // 块捕获和try处理异常 catchfinally
    • 非终止错误通常不能通过try//处理catchfinally因为除非-ErrorActionis否则不会抛出异常Stop
  • Ignore: 错误被吞下,没有任何迹象表明它发生了。-ErrorVariable在这种情况下,$error堆栈都不会更新。
  • Inquire: 询问操作员如果发生错误怎么办。

使用上面的知识,我们仍然可以依赖$error自动变量和指定
-ErrorVariable的要填充的 if-ErrorActionSilentlyContinue

注意:您还可以使用该$ErrorView变量来进一步控制错误在控制台中的显示方式。


要回答您的子问题,没有提供“命名”错误堆栈的机制,但您可以使用内置$error堆栈来跟踪发生的错误(并且未发生在 下
-EA Ignore)。如果你想确保你的脚本/会话/等中只有在某个时刻发生的错误,你可以调用以下命令来清除错误变量:

$error.Clear()

附加信息

于 2021-09-10T13:54:15.793 回答