(PowerShell)记录例外并继续(Active Directory模块)

时间:2015-08-08 19:41:22

标签: powershell exception-handling active-directory

我正在使用New-ADUser和Add-ADGroupMember

如果用户已经存在或已经在组中,则函数会抛出异常(这是预期的而不是问题)。

如何将例外记录到文件并继续?

  • Redirection不起作用 - 例外情况总是发生在 安慰。
  • -ErrorAction无效 - 例外情况仍然发送到控制台
  • 尝试/抓取工作,但执行停止,其余命令不运行
  • 我可以针对每个单一的判断进行尝试/捕获,但似乎是这样 荒谬

2 个答案:

答案 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时,您会看到在将错误写入控制台后,执行陷阱,并恢复执行流程的其余部分:

Test-Trap screenshot

通常出现在屏幕上的错误记录输出(由Out-String提供)已保存到文件中:

resulting log file

您可以为陷阱添加时间戳和堆栈跟踪等很酷的功能:

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
}

Trap log with stacktrace