Powershell 通过用于日志记录的管道处理错误

Powershell 通过用于日志记录的管道处理错误,powershell,error-handling,pipeline,error-logging,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天前被禁用的所有用户,并将其删除。 所以,我要寻找的是如何处理和错误,如果一个地方发生,以便它可以被记录

我想知道是否有人能给我一些通过管道处理非终止错误的技巧? 下面是我想做的一个例子

Get-ADUser -Filter {Enabled = 'False'} -Properties Modified | Where Modified -LT (Get-Date).AddDays(-30) | Remove-ADUser -Confirm:$false
基本上,找到上次修改的时间戳不到30天前被禁用的所有用户,并将其删除。 所以,我要寻找的是如何处理和错误,如果一个地方发生,以便它可以被记录

我曾想过使用try-catch,但如果出现错误,则整个命令将停止。我希望它是一个非终止错误,这样它将继续处理它找到的所有用户,但随后有一种方法来查看是否存在任何错误,以便我可以记录它们


有什么建议吗?

您可以使用-ErrorVariable而不使用Try-Catch构造,甚至不使用-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,默认情况下为“Continue”)

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

更妙的是,这些错误变量是类型为“ErrorRecord”的对象,具有数字a属性,如:TargetObject、Exception、InvocationInfo、fullyQualifiedErrorID等。。。
因此,您可以进一步操作错误变量对象,以准确记录所需内容。

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

$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
}
}

也许您需要研究-ErrorVariable公共参数。尝试运行
获取有关\u CommonParameters的帮助
,并检查该参数。