If statement returns error when $false is expected

Welcome Forums General PowerShell Q&A If statement returns error when $false is expected

This topic contains 4 replies, has 4 voices, and was last updated by

 
Participant
1 week, 6 days ago.

  • Author
    Posts
  • #127722

    Participant
    Points: 33
    Rank: Member

    Hello PowerShell experts!

    I hope someone can help with the below.

    I am creating a Scale Set in Azure and using DSC to configure the VMs.  The scale set (of 50 VMs) is created once a week for about 12hrs and then discarded at the end of the day.

    The DSC Configuration File has been successful for the past 5 or 6 months without any glitches until recently when the Scale Set provisioning failed.

    Looking at the error from Azure, it is related to DSC.

    Looking at the DSC log file:

    VERBOSE: [2018-12-03 00:18:36Z] [VERBOSE] [Feb201800053Z]: LCM:  [ Start

    Resource ]  [[xScript]Reboot]

    VERBOSE: [2018-12-03 00:18:36Z] [VERBOSE] [Feb201800053Z]: LCM:  [ Start  Test

    ]  [[xScript]Reboot]

    VERBOSE: [2018-12-03 00:18:36Z] [VERBOSE] [Feb201800053Z]:

    [[xScript]Reboot] Begin executing test script.

    VERBOSE: [2018-12-03 00:18:36Z] [VERBOSE] [Feb201800053Z]:

    [[xScript]Reboot] Executing script:

    If (Get-eventlog system -After (get-date).Date -Source

    'User32' ) {

    Return $true

    } Else {

    Return $false

    }

    VERBOSE: [2018-12-03 00:18:36Z] [VERBOSE] [Feb201800053Z]: LCM:  [ End    Test

    ]  [[xScript]Reboot]  in 0.3590 seconds.

    VERBOSE: [2018-12-03 00:18:36Z] [ERROR] PowerShell DSC resource

    MSFT_xScriptResource  failed to execute Test-TargetResource functionality with

    error message: System.InvalidOperationException: The test script threw an

    error. —> System.ArgumentException: No matches found

     

    — End of inner exception stack trace —

    VERBOSE: [2018-12-03 00:18:36Z] [VERBOSE] [Feb201800053Z]: LCM:  [ End    Set

    ]

     

    The DSC configuration file section is configured as below:

    xScript Reboot

    {

    SetScript = {

    Restart-Computer -force

    }

    TestScript = {

    If (Get-eventlog system -After (get-date).Date -Source 'User32' ) {

    Return $true

    } Else {

    Return $false

    }

    }

    GetScript = { }

    DependsOn = "[xScript]ConfigPlexos"

    PsDscRunAsCredential = $Credential

    }

     

    Essentially what it is supposed to do is check if the VM has rebooted after installing a package (denoted here by the line DependsOn) . If it hasn't, then it restarts.

    I was able to fix this issue by adding -ErrorAction Silently Continue on the IF statement.

    The question I have is 'Why!?'

    The if statement checks if there is an event in the System log where the source is User32.  If there is, the TestScript should return $true.  If there isn't, then the TestScript should return $false.  It worked fine for 5 or 6 months... Why is it now spitting an error 'No Matches Found'?  It shouldn't spit out an error but should rather spit out $false shouldn't it??

    Thank you in advance for your help and efforts.

    Karim

  • #127756

    Participant
    Points: 105
    Helping Hand
    Rank: Participant

    After some trials and errors... It throws an error, if the source is not present in the eventlog. If the source is present, but it doesn't satisfy your filter, it doesn't throw.

  • #127759

    Participant
    Points: 190
    Helping Hand
    Rank: Participant

    Check on the server(s) that cause the issue if the -Source User32 actually exist in the eventlog.

    E.g.

    get-eventlog -LogName System | select -Unique source
    

    The error as far as I can tell is because the source doesn't exist or isn't registered.
    If the statement errors out it will output that error message.
    So you need to do silentlycontinue to avoid the output.

    It will give you the "false" result that you expect but it will also output the error message.

  • #127780

    Participant
    Points: 885
    Helping Hand
    Rank: Major Contributor

    This can always happen and error handling is the only way to handle this scenario. PowerShell gives us the capability to put expressions as condition for If loop.
    I have seen many such scripts. what you really need here is to handle use -ErrorAction SilentlyContinue as mentioned above. When we write scripts, we miss such instances where errors can occur, but realizes when this kind off scenarios comes. But you have to decide whether to return false if the event source itself is not there .

  • #127897

    Participant
    Points: 33
    Rank: Member

    Hello everyone,

    Thank you for all your input.

    After I posted my question, I did some trials on my laptop and all 3 of you are correct in that:

    The Get-EventLog cmdlet will first retrieve all the contents of the log and then filter the result for the searched item. If the item is present, the result is $true if the item is present within the searched time frame and $false if it is not.  Now, if the item is not present in the whole log, then the output is an error and $false.

    So yes, @phansen and @Frederick, the error is because the source is absent in the entire log.

    @kvprasoon, -ErrorAction SilentlyContinue is what I had added to fix the issue.

    Now, what is even more interesting (and will be tested soon) is why has this not appeared in the past 5 or 6 months.  What I mean is, if the command was there this whole time without the -ErrorAction SilentlyContinue switch and, if the VM Scale Set is provisioned from scratch (therefore the logs *should* be empty), why has the failure just occurred? Stay tuned, I will test and post my findings here in 2 days' time for anyone who is / will be interested.

    Again, thank you all for your help, input and efforts!

    Karim

You must be logged in to reply to this topic.