Any error in PowerShell code surfaces as an error record object. Check out the function below which extracts all relevant error information from such error record:
function Get-ErrorInfo { param ( [Parameter(ValueFrompipeline)] [Management.Automation.ErrorRecord]$errorRecord ) process { $info = [PSCustomObject]@{ Exception = $errorRecord.Exception.Message Reason = $errorRecord.CategoryInfo.Reason Target = $errorRecord.CategoryInfo.TargetName Script = $errorRecord.InvocationInfo.ScriptName Line = $errorRecord.InvocationInfo.ScriptLineNumber Column = $errorRecord.InvocationInfo.OffsetInLine Date = Get-Date User = $env:username } $info } }
This function makes error handling code a lot shorter and easier to understand. If you must respond immediately to an error, use the try/catch concept, and make sure you instruct cmdlets via -ErrorAction Stop to immediately stop when an error occurs:
try { Stop-Service -Name someservice -ErrorAction Stop } catch { $_ | Get-ErrorInfo }
If you want the code to complete, and only later check for errors that may have occurred, use -ErrorAction SilentlyContinue in conjunction with -ErrorVariable. Again, the function Get-ErrorInfo helps a lot:
$result = Get-ChildItem -Path C:\Windows -Filter *.ps1 -Recurse -ErrorAction SilentlyContinue -ErrorVariable myErrors $myErrors | Get-ErrorInfo