我正在使用New-ADUser和Add-ADGroupMember
如果用户已经存在或已经在组中,则函数会抛出异常(这是预期的而不是问题)。
如何将例外记录到文件并继续?
答案 0 :(得分:1)
您可以将-ErrorAction SilentlyContinue
与-ErrorVariable
合并:
$e = $null
New-ADUser iExist -ErrorAction SilentlyContinue -ErrorVariable e
$e # contains the error
您还可以使用内置的$Error
变量,它是一个包含所有错误的循环缓冲区。
$ErrorPreference = SilentlyContinue # I don't like this personally
New-ADUser iExist
Add-ADGroupMember iExist iForgotTheParameters
$Error[0] # The Add-ADGroupMember error
$Error[1] # The New-ADUser error
所以你可以设置你的$ErrorPreference
,做一堆命令,最后做一些像$Error | Out-File -Path errors.txt
这样的事情。
请查看PowerShell Error Handling and Why You Should Care以获取更多想法。
答案 1 :(得分:1)
实现此目的的最简单方法可能是使用trap
构造:
function Test-Trap{
trap {
$_ | Out-String | Out-File C:\path\to\errors.txt -Append
}
Get-ADUser -NoSuchParam "argument"
Write-Host "Show must go on"
nonexistingcommand
Write-Host "Still executing"
}
当您调用Test-Trap
时,您会看到在将错误写入控制台后,执行陷阱,并恢复执行流程的其余部分:
通常出现在屏幕上的错误记录输出(由Out-String
提供)已保存到文件中:
您可以为陷阱添加时间戳和堆栈跟踪等很酷的功能:
function Test-Trap{
trap {
$LogPath = "C:\path\to\errors.txt"
$ErrorCount = $ErrorCount + 1
$("[Error {0} trapped {1}]:" -f $ErrorCount,(Get-Date -Format "dd/MM/yyyy HH:mm:ss.fff")) | Out-File $LogPath -Append
$_ | Out-String | Out-File $LogPath -Append
if(($st = $_.Exception.Stacktrace)){ $st |Out-File $LogPath -Append }
$("[Error {0} logged]" -f $ErrorCount)| Out-File $LogPath -Append
}
Provoke-Error -NoSuchParam muhahaha
}