DarkLite1
DarkLite1

Reputation: 14695

PowerShell Remove the last error

In my PowerShell script I try to do some error handling. However, I'm depending on an advanced function that uses the Try/Catch clauses. So once in a while the code block in the function fails and goes to the Catch clause after generating an error. At this point the variable $Error is filled with one error.

If I then consult within my script the variable $Error it tells me there's one record, which is correct. But I would like to know if it's possible to only delete the last error within the function in the Catch clause? So I can keep my $Error variable clear for the script errors.

The problem is within Get-ADTSProfileHC. I tried to delete the last error with $Error[0] | Remove-Item but it failed.

The function:

Function Get-ADusersHC {

    [CmdletBinding(SupportsShouldProcess=$True)]
    Param(
         [Parameter(ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true,Position=0)]
         [String[]] $OU
    )

    Begin {
        Function Get-ADOUNameHC {
            $CanonicalName = $_.CanonicalName
            [System.Collections.ArrayList]$Pieces = $CanonicalName.split(“/”) 
            $Pieces.Remove($Pieces[-1])
            $OU = $Pieces -join '\'
            $OU -replace ($Pieces[0],$Pieces[0].ToUpper())
        }

        Function Get-ADManagerDisplayNameHC {
            $m = Get-ADObject -Identity $_.manager -Properties displayName,cn
            if($m.ObjectClass -eq "user") { $m.displayName } Else{ $m.cn }
        }

        Function Get-ADTSProfileHC {

            [CmdletBinding()]
            Param(
                [Parameter(Mandatory=$true,Position=0)]
                [String] $DistinguishedName,
                [parameter(Mandatory=$true,Position=1)]
                [ValidateNotNullOrEmpty()]
                [ValidateSet('UserProfile','AllowLogon','HomeDirectory','HomeDrive')]
                [String]$Property
            )

            Begin {
                $User = [ADSI]"LDAP://$DistinguishedName"
            }

            Process {
                Try {
                    Switch ($Property) {
                        'AllowLogon'    {if ($($User.psbase.InvokeGet('allowLogon')) -eq '1'){$True}else{$False}}
                        'HomeDirectory' {$User.psbase.InvokeGet('TerminalServicesHomeDirectory')}
                        'HomeDrive'     {$User.psbase.InvokeGet('TerminalServicesHomeDrive')}
                        'UserProfile'   {$User.psbase.InvokeGet('TerminalServicesProfilePath')}
                    }
                }
                Catch {
                    # When we receive an error, it means the field has never been used before and is blank
                    # this is due to an error in the AD (same problem with the Quest CmdLet), AllowLogon is 
                    # always 'TRUE' but we don't set it because we can't read it sometimes so we write 'blanks'
                    Write-Output $null
                }
            }
        }
    }

    Process {    
        Foreach ($_ in $OU) {
            Write-Verbose "Function Get-HCADusersNoManager > OU: $_"
            Write-Verbose "Function Get-HCADusersNoManager > Manager field empty"
            Get-ADUser -SearchBase $_ -Filter 'SAMAccountName -eq "shenn"' -Properties * |
            #Get-ADUser -SearchBase $_ -Filter * -Properties * |
            Foreach {
                $Properties = ([Ordered] @{
                        "Creation date" = $_.whenCreated;
                        "Display name" = $_.displayName;
                        "CN name" = $_.name;
                        "Last name" = $_.sn;
                        "First name" = $_.givenName;
                        "Logon name" = $_.sAMAccountName;
                        "Manager" = if($_.manager){Get-ADManagerDisplayNameHC};
                        "Employee ID" = $_.EmployeeID;
                        "HeidelbergcCement Billing ID" = $_.extensionAttribute8
                        "Type of account" = $_.employeeType;
                        "OU" = Get-ADOUNameHC;
                        "Notes" = $_.info -replace "`n"," ";
                        "E-mail" = $_.EmailAddress;
                        "Logon script" = $_.scriptPath;
                        "TS User Profile" = Get-ADTSProfileHC $_.DistinguishedName 'UserProfile';
                        "TS Home directory" = Get-ADTSProfileHC $_.DistinguishedName 'HomeDirectory';
                        "TS Home drive" = Get-ADTSProfileHC $_.DistinguishedName 'HomeDrive';
                        "TS Allow logon" = Get-ADTSProfileHC $_.DistinguishedName 'AllowLogon'
                        })
                $Object = New-Object -TypeName PSObject -Property $Properties
                Write-Output $Object
            }
        }
    } 
}

Upvotes: 4

Views: 5035

Answers (2)

DanL
DanL

Reputation: 2014

Two easy ways to do this:

$error.Remove($error[0])
$Error.RemoveAt(0)

Don't forget to check there is an error first.

Upvotes: 8

Fco Javier Rod Ca
Fco Javier Rod Ca

Reputation: 79

 $Error.Remove($error[$Error.Count-1])

If errors variable is empty, you will not get any exception

I hope it helps

Upvotes: 2

Related Questions