通过管道处理错误以进行日志记录

时间:2014-07-30 19:23:04

标签: powershell error-handling pipeline error-logging

我想知道是否有人能够通过管道向我提供一些处理非终止错误的提示? 这是我想做的一个例子。

Get-ADUser -Filter {Enabled = 'False'} -Properties Modified | Where Modified -LT (Get-Date).AddDays(-30) | Remove-ADUser -Confirm:$false

基本上找到在上次修改时间戳少于30天之前被禁用的所有用户并删除它们。 所以,我正在寻找的是如何处理和错误,如果一个地方发生,以便它可以被记录

我想过使用try catch,但是如果发生错误,那么整个命令就会停止。我希望它是一个非终止错误,以便它将继续处理它找到的所有用户,但然后有办法查看是否有任何错误,以便我可以记录它们

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以在没有Try-Catch构造的情况下使用-ErrorVariable,甚至不使用-ErrorAction。 所以,例如,你可以这样做:

Get-ADUser -Filter {Enabled = 'False'} -Properties Modified -ErrorVariable Get-ADuserErr |`
Where Modified -LT (Get-Date).AddDays(-30) -ErrorVariable Where-ObjectErr |`
Remove-ADUser -Confirm:$false -ErrorVariable Remove-ADuserErr
If ($Get-ADuserErr) {
Write-Output $Get-ADuserErr }
If ($Where-ObjectErr) {
Write-Output $Where-ObjectErr }
If ($Remove-ADuserErr) {
Write-Output $Remove-ADuserErr }

这样你就有了一个不同的变量来存储每个命令的错误,你得到了默认的错误处理行为(来自$ ErrorActionPreference,这是"继续"默认情况下)。

此外,您的错误变量($ Get-ADuserErr,$ Remove-ADuserErr等等)是可以通过管道传输到Out-File以将错误记录到文件中的对象。

更好的是,这些错误变量是#34; ErrorRecord"类型的对象。它有一个数字属性,如:TargetObject,Exception,InvocationInfo,fullyQualifiedErrorID等... 因此,您可以进一步操作错误变量对象,以准确记录您想要的内容。

答案 1 :(得分:0)

不是使用管道,你可以做这样的事情。这样它只会为每个实例抛出一个错误。

$Users = Get-ADUser -Filter {Enabled = 'False'} -Properties Modified | Where Modified -LT (Get-Date).AddDays(-30)

$Users | foreach {
try {
Remove-ADUser $_ -Confirm:$false
} catch {
Write-Error $_.Exception.Message
}
}