1

I have been working on the following example from one of Don Jones' powershell books as part of my personal development and am having some serious trouble getting the try/catch construct to work as it should. As you can see, when the catch block executes, it sets a variable called $everything_ok to $false - which should trigger the else block in the following code. Which it does - the logfile is appended as per my expectations.

However it does not stop the script from ALSO executing the code in the if block and spewing out 'The RPC Server is unavailable' errors when it tries to query the made-up machine 'NOTONLINE' (Exception type is System.Runtime.InteropServices.COMException).

What makes this even stranger is that I went through the script with breakpoints, checking the contents of the $everything_ok variable along the way, and it never contained the wrong value at any point. So why on earth is the if block still executing for 'NOTONLINE' when the condition I have specified ( if ($everything_ok = $true) ) has not been met?

Am I doing something wrong here?

function get-systeminfo {
    <#
    .SYNOPSIS
    Retrieves Key Information on 1-10 Computers
    #>
    [cmdletbinding()]
    param (
        [parameter(mandatory=$true,valuefrompipeline=$true,valuefrompipelinebypropertyname=$true,helpmessage="computer name or ip address")]
        [validatecount(1,10)]
        [validatenotnullorempty()]
        [alias('hostname')]
        [string[]]$computername,
        [string]$errorlog = "C:\retry.txt",
        [switch]$logerrors
    )
    BEGIN {
        write-verbose "Error log will be $errorlog"
        }
    PROCESS {

        foreach ($computer in $computername) {
            try {$everything_ok = $true
                gwmi win32_operatingsystem -computername $computer -ea stop
                } catch {
                $everything_ok = $false
                write-verbose "$computer not Contactable"
                } 
            if ($everything_ok = $true) {
                write-verbose "Querying $computer"
                $os = gwmi win32_operatingsystem -computername $computer
                $cs = gwmi win32_computersystem -computername $computer
                $bios = gwmi win32_bios -computername $computer
                $props = @{'ComputerName' = $cs.__SERVER;
                        'OSVersion' = $os.version;
                        'SPVersion' = $os.servicepackmajorversion;
                        'BiosSerial' = $bios.serialnumber;
                        'Manufacturer' = $cs.manufacturer;
                        'Model' = $cs.model}
                write-verbose "WMI Queries Complete"
                $obj = new-object -type psobject -property $props
                write-output $obj
            }
            elseif ($everything_ok = $false) {
                if ($logerrors) {
                        "$computer $_" | out-file $errorlog -append
                        }
                }
        }
    }
    END {}
}

get-systeminfo -host localhost, NOTONLINE -verbose -logerrors

1 Answer 1

4

The equals sign in Powershell is used as the assignment operation. -eq is used to test for equality. So your if statement is assigning $true to $everything_ok, which then tests true.

Sign up to request clarification or add additional context in comments.

1 Comment

Nice one, thanks! It turns out in this case I can also leave the assignment operator out altogether, as it's a boolean value. Knew it would be something simple...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.