This is day 4 of how to create an error log.
Today we will be using a custom object for our error
log. We can actually do this in two
different ways. We could create a custom
object with specific information from the error object produced by PowerShell
or create a custom log ourselves.
If we utilize the object created by PowerShell with a CSV error
log, then we need to make sure that we only utilized 2D data. That is information that is not a complex
object itself.
Function Test-ADUsers
{
[CmdletBinding()]
Param (
[parameter(Mandatory=$true)]
[String[]]
$Names,
[Switch]
$NoAppend
# Begin Support Functions
)
Function
Test-ErrorLog
{
[CmdletBinding()]
Param (
[parameter(Mandatory=$true)]
[String]
$Path,
[parameter(Mandatory=$true)]
[String]
$Name
)
# Test
the path.
If
(!(Test-Path
-Path $Path))
{
Write-Verbose
"Creating the directory $Path"
New-Item
-Path $Path
-ItemType Directory
}
# Test
the file
If
(!(Test-Path
-Path "$Path\$Name"))
{
Write-Verbose
"Creating the file $Name"
New-Item
-Path "$Path\$Name" -ItemType File
}
} # END:
Function Test-ErrorLog
# End Support Functions
# Verify that
the error log is present.
Test-ErrorLog
-Path c:\ps\error
-Name Errorlog.csv
# If
-NoAppend is TRUE, then clear the error log.
If(($NoAppend))
{
Write-Verbose
"Clearing the error log"
Remove-Item
-Path C:\PS\error\ErrorLog.csv
-Force
New-Item
-Path C:\PS\error
-Name ErrorLog.csv
-ItemType File
}
ForEach
($Name in
$Names)
{
Try
{Get-ADUser -Identity
$Name -ErrorAction
Stop -ErrorVariable
MyError}
Catch
{
$Obj
= New-Object
-TypeName PSObject
-Property @{
TimeGenerated = (Get-Date).ToString()
UserName = $Name
Message = $MyError.Message
}
$Obj
| Export-csv
-Path C:\PS\Error\ErrorLog.csv -Append
$MyError
| Select *
}
}
}
# END: Function Test-ADUsers
Test-ADUsers -Names "Administrator",
"Bad",
"Administrator" -Verbose
Take a look at the Get-ADUser
cmdlet. We added the –ErrorVariable parameter to store our error object.
Next, look at the Catch block. You
can see the creation of the object to be sent to our error log.
TimeGenerated will be the time the error is recorded. Notice, I’m only sending a string, not a
SYSTEM.DATTIME object that is normally produce by Get-Date
UserName is the name of the user that we are currently
testing.
Message contains the message property of the error object.
The Export-CSV
cmdlet also has a huge advantage. We are
using the –Append parameter. This means that we will add new records as
needed. The –NoAppend parameter that
we created earlier prevents us from appending to a file that already
exists. The –Append parameter of Export-CSV is needed to ensure that we
record all error instances when the code is ran. Otherwise we will only have a record of the
last error recorded.
Comments