If my logic is right I think this should work, this script would run indefinitely.
For sending Mails in PowerShell you have two options that I'm aware of, one is using the cmdlet designed for that: Send-MailMessage
However, this is important to be aware of:
Warning
The Send-MailMessage cmdlet is obsolete. This cmdlet does not guarantee secure connections to SMTP servers. While there is no immediate replacement available in PowerShell, we recommend you do not use Send-MailMessage. For more information, see Platform Compatibility note DE0005.
You can find the second option here using Net.Mail.MailMessage.
Now for the code of the script, here is something you can use:
# Define the full path of your logs folder
$logsFolder = 'fullPath\to\logsFolder'
# Function for monitoring and retrieving the newest log file Full Path
function monitorPath($LogPath){
(Get-ChildItem "$LogPath\*.txt" |
Sort-Object -Descending CreationTime |
Select-Object -First 1).FullName
}
# Get the newest log file
$logFilePath = monitorPath -LogPath $logsFolder
while($true)
{
# If we don't have today's date stored
# or the update trigger is True
if($updateDate -or -not $today)
{
$today = [datetime]::Today
$updateDate = $false
}
if($today -lt [datetime]::Today)
{
# Trigger our previous condition
$updateDate = $true
# Get the new log file for this day
$logFilePath = monitorPath -LogPath $logsFolder
}
if((Get-Content $logFilePath -Raw) -match 'Error')
{
# Send mail message goes here
}
Start-Sleep -Seconds 60
}
It is important to note that, this would spam your inbox every minute if there is an error in the log file so it will probably be a good idea to add a new condition in this block:
if((Get-Content $logFilePath -Raw) -match 'Error')
{ .... }
For example something like this:
if((Get-Content $logFilePath -Raw) -match 'Error' -and -not $emailSentThisDay)
{
# Send mail message goes here
# Here you set this bool to True so you don't get spammed :D
$emailSentThisDay = $true
}
If this is something you will consider then you will need to reset the $emailSentThisDay bool every new day so:
if($today -lt [datetime]::Today)
{
# Trigger our previous condition
$updateDate = $true
# Reset the antispam bool if this is a new day
$emailSentThisDay = $false
# Get the new log file for this day
$logFilePath = monitorPath -LogPath $logsFolder
}