我希望在我遇到的问题上得到一些帮助,一旦我将 -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 变量。
注:
Remove-DistributionGroupMember
中的一个明显的错误阻止了在存在
$Error
的情况下在-ErrorAction SilentlyContinue
中记录非终止错误,由于未知的原因,可以通过使用2>$null
来绕过改为静音错误输出。
-ErrorAction
SilentlyContinue
继续做在自动$Error
变量中记录非终止错误(只有-ErrorAction Ignore
不会)。
不要使用If ($Error -ne $null)
来测试最近的语句中是否发生错误,因为
$Error
包含迄今为止在会话中中发生的所有错误。 顺便说一句:
自动$?
变量
if (-not $?)
$Error.Clear()
,这样您就可以使用
if ($Error.Count -gt 0)
,但这是以清除会话级错误历史记录为代价的。
参数,它允许您在自选变量中收集给定调用的非终止错误(必须指定 without
$
;例如,-ErrorVariable errs
,以便收集$errs
中的错误);请注意,仍然需要-ErrorAction SilentlyContinue
(或重定向
2>$null
)来防止错误输出。
-ErrorAction
参数独占
的作用 -不触发
catch
语句块try ... catch ... finally
- 仅终止错误确实如此。您可以使用
-ErrorAction Stop
将catch
块。
请注意,在 catch
$_
变量
更简单地引用触发错误;也就是说,您可以使用
$Error[0]
来代替 $_
。
有关 PowerShell 极其复杂的错误处理的全面概述,请参阅 GitHub 文档问题 #1583
令人惊讶的是,用 -ErrorAction SilentlyContinue
感谢@mklement0 的帮助!非常感激!我给你买了一杯咖啡来表示感谢!重定向到 2>$null 并不总是能抑制错误。例如,如果您运行以下命令,它将捕获错误并将其显示在控制台中:
$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
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