ElmerBruin889
ElmerBruin889

Reputation: 15

Simple powershell success or fail log

I'm looking for the easiest way to write the success or failure of a scheduled script to a csv file. I am not looking for a way to log the error or reason of failure just a simple "Succes/Failure". For this reason i'm not trying to fix/log non-terminating errors.

I thought the easiest way to put every script in a

    try {
Write-Host "test"
    }
    catch{
Code to write to csv here 
    }

Block where I write to a csv file in the Catch part. Is there a better/easier way to do this or is this the right way to go?

Upvotes: 0

Views: 1282

Answers (1)

Abraham Zinala
Abraham Zinala

Reputation: 4694

Continuing from my comment. . .

Honestly, this really depends on the situation, i.e. what is you're trying to accomplish. So, let's make up a scenario of querying a computer for some basic info:

Function Get-SystemInfo {
    Param (
        
        [Parameter(Mandatory=$false,
                   ValueFromPipeline=$true,
                   ValueFromPipelineByPropertyName=$true)]
        [string[]]$ComputerName = $env:COMPUTERNAME
    
    )
    Begin {

        $ErrorActionPreference = 'SilentlyContinue'

    }
    Process {

        foreach ($Computer in $ComputerName) 
        {
            try {

                # attempt cim session with -EA Stop to not allow it to go
                # any further and we can calculate the results.
                $CIMSession = New-CimSession -ComputerName $Computer -ErrorAction Stop

                $Status     = $true

                # Perform the actual queries
                $CS = Get-CimInstance -ClassName Win32_COmputerSystem -CimSession $CIMSession
                $BS = Get-CimInstance -ClassName Win32_BIOS -CimSession $CIMSession 

                # evaluate against the returned objects
                $UserName     = if ($CS.UserName -eq $null) { 'No User Logged in' } else { $CS.UserName }
                $Manufacturer = if ($CS.Manufacturer -eq $null) { 'N/a' } else { $CS.Manufacturer }
                $Model        = if ($CS.Model -eq $null) { 'N/a' } else { $CS.Model }
                $SerialNumber = if ($BS.SerialNumber -eq $null) { 'N/a' } else { $BS.SerialNumber }

            }
            catch {

                # Set the variables to $null
                $Status       = $false

                $UserName     = $null
                $Manufacturer = $null
                $Model        = $null
                $SerialNumber = $null

            }
            finally {

                # Output the filled variables
                [PSCustomObject] @{

                    ComputerName = $Computer
                    Connected    = $Status
                    UserLoggedIn = $UserName
                    Manufacturer = $Manufacturer
                    Model        = $Model
                    SerialNumber = $SerialNumber 

                }

            }

        }

    }

    End {
        
        # cleanup
        
        # some people argue this should be in the finally block
        # to disconnect any machine, but looking at this from both
        # sides, they both have pros/cons.    
        Get-CimSession | Remove-CimSession

    }

}

... the biggest take-away from this quick function, is the -ErrorAction Stop while trying to create a CIM session. This is where looking at the bigger picture comes into play. If you are unable to connect to the computer, why bother continuing? This includes getting an echo reply from a quick ping since that doesn't dictate that you can connect to the remote PC just because you got a reply.

The rest is the if, and else statements that handle the light work evaluating against the returned objects for more control over the output.

Results would be:

PS C:\Users\Abraham> Get-SystemInfo

ComputerName : OER
Connected    : True
UserLoggedIn : Abraham
Manufacturer : LENOVO
Model        : 22251
SerialNumber : 55555555




PS C:\Users\Abraham> Get-SystemInfo -ComputerName BogusComputerName

ComputerName : BogusComputerName
Connected    : False
UserLoggedIn : 
Manufacturer : 
Model        : 
SerialNumber : 

Upvotes: 1

Related Questions