I was recently troubleshooting an issue and needed to view the last few results of a log. CMTrace and text editors would crash due to the sheer size of the log. Powershell’s Get-Content with the “Tail” parameter worked like a charm however. Although this worked, I didn’t want to keep running the command over and over, so, I decided to replicate the watch command from Linux in PowerShell.
<#
.SYNOPSIS
Repetitively runs a script block to allow you to track changes in the command output. An example use would be for watching log inputs. Press CTRL+C to cancel script. It runs indefinitely.
.PARAMETER ScriptBlock
Script to execute
.PARAMETER Interval
How often to rerun scriptblock in seconds
.NOTES
Version: 1.0
Author: Matthew Thompson
Creation Date: 2017-07-19
Purpose/Change: Initial script development
.EXAMPLE
&"Start-Watch.ps1" -ScriptBlock {Get-Content -Path "C:\Logs\SomeLog.log" -Tail 20} -Interval 10
#>
Param([scriptblock]$ScriptBlock, [int32]$Interval=5)
#Put the real code in a function so it can be quickly copy-pasted as a child function of other scripts
function Start-Watch
{
Param([scriptblock]$ScriptBlock, [int32]$Interval)
#Set lowest possible datetime, so that it will run script immediatly
$Start = [DateTime]::MinValue
#Infinite loop, cancel require user intervention (CTRL+C)
while($true)
{
#If enough time has passed (Now - LastAttempt)>Selected interval
if ([DateTime]::Now - $Start -ge [TimeSpan]::FromSeconds($Interval))
{
#Clear console and call function
Clear-Host
$ScriptBlock.Invoke()
#Set new start time/last attempt
$Start = [DateTime]::Now
}
#Sleep the thread, prevents CPU from falsly registering as 100% utilized
[System.Threading.Thread]::Sleep(1)
}
}
#Call watch function
Start-Watch -ScriptBlock $ScriptBlock -Interval $Interval