Add Stored Variable Value to Event Log Message

I’m trying to add a value that is stored as a variable to the -Message parameter when using Write-EventLog. I’m not quite understanding my the variable isn’t displaying when the message is written. This variable does contain a value and displays fine when using Write-Host. Am I missing a silly formatting rule here?

https://gist.github.com/billkindle/6860f562fabacd01722247aff339f2de

Based on what you posted, this code should error out. As your final If statement denotes errors.

The PoSH ISE pops up errors

Missing '= ’ operator after key in hash literal
The hash literal was incomplete.
Duplicate Keys ‘if’ not allowed in hash literals

Both the Write-EventLog cmdlets in that if statement, are reflected as non-functional. Meaning the PoSH syntax color codeing shows they are in error.

If you look at you code, you do not close the first hashtable block.
This …

$MyEventWarn = @{
    LogName='Application';
    Source='QAS';
    EventID='56789';
    EntryType='Warning';
    Message="QAS data will expire soon and requires an update. Days remaining:$num" 
    #This doesn't write the value
$MyEventInfo = @{
    LogName='Application';
    Source='QAS';
    EventID='56788';
    EntryType='Information';
    Message="QAS data is current. No remediation required at this time. Days remaining:$num" 
    #This doesn't write the value
}

Vs this…

$MyEventWarn = @{
    LogName='Application';
    Source='QAS';
    EventID='56789';
    EntryType='Warning';
    Message="QAS data will expire soon and requires an update. Days remaining:$num" 
    }

$MyEventInfo = @{
    LogName='Application';
    Source='QAS';
    EventID='56788';
    EntryType='Information';
    Message="QAS data is current. No remediation required at this time. Days remaining:$num" 
}

There’s a copy paste error there. The source has the correct syntax. Even when I view this in VScode, using the normal variable syntax doesn’t seem to work when placed in the Message array entry. I’m stumped.

Am I wrong or do you use the variable before filling it? This way it should work actually:

# Variable containing extracted data for analysis
$data = Select-String -Pattern "Data Expiry" -Path $LogPath\$Log | ForEach-Object {$_.Line}

# Create substring data by trimming the excess info. We just need the number of days.
$start = $data.IndexOf(':') + 1
$end   = $data.IndexOf("days")
$length = $end - $start
[int]$num = $data.Substring($start,$length).TrimStart(" ")

# Splatting technique used here to pre-define the events that will be written to the systems Application Log
$MyEventWarn = @{
    LogName='Application';
    Source='QAS';
    EventID='56789';
    EntryType='Warning';
    Message="QAS data will expire soon and requires an update. Days remaining: $num" #This doesn't write the value
}
$MyEventInfo = @{
    LogName='Application';
    Source='QAS';
    EventID='56788';
    EntryType='Information';
    Message="QAS data is current. No remediation required at this time. Days remaining: $num" #This doesn't write the value
}

# Once the value is known, we have to decide which message to write to the event log so that System Center
# can pick up the entry and perform remediation tasks.
if ($num -le 10) {
    Write-EventLog @MyEventWarn
}
else {
    Write-EventLog @MyEventInfo
}

I don’t use the variable anywhere else other than the splatting arrays but if this is just a matter of where I have declared my splatting array, I will feel pretty silly.
I typically put all that type of info (splats, static variables) at the very top of my script so it makes for easier editing by others on my team. I’ll re-arrange the splatting and re-test.

[UPDATE]
Yeah now I feel silly. Took your suggestion and moved the splatting arrays to just after when $num is declared and it worked. Thank you!