In PowerShell scripts it is sometimes helpful to use a timer, for example to measure how long a certain task takes. If you create GUI applications with PowerShell, it can be useful to display a timer during a long-running task. It’s actually quite simple to do and there are plenty of examples for C# programmers, but not for PowerShell scripters, so I thought I would write this quick post to demonstrate how it can be done.
This example uses a WPF window to display a timer as a stopwatch application, but you can of course re-use the code for your needs. The System.Diagnostics.Stopwatch class can be used to measure time, and the System.Windows.Forms.Timer class can be used to display the time in a GUI window via the Tick event.

# Load Assemblies
Add-Type -AssemblyName PresentationFramework, System.Windows.Forms
# Define XAML code
[xml]$xaml = @"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Stopwatch" Height="273.112" Width="525" ResizeMode="CanMinimize">
<Grid>
<TextBox x:Name="Time" HorizontalContentAlignment="Center" IsReadOnly="True" VerticalContentAlignment="Center" FontSize="80" FontFamily="Segui" BorderThickness="0" HorizontalAlignment="Left" Margin="11,10,0,0" TextWrapping="Wrap" Text="00:00:00" VerticalAlignment="Top" Height="94" Width="496"/>
<Button x:Name="Start" Content="Start" HorizontalAlignment="Left" FontSize="45" Background="GreenYellow" Margin="11,124,0,0" VerticalAlignment="Top" Width="154" Height="104"/>
<Button x:Name="Stop" Content="Stop" HorizontalAlignment="Left" FontSize="45" Background="Tomato" Margin="180,124,0,0" VerticalAlignment="Top" Width="154" Height="104"/>
<Button x:Name="Reset" Content="Reset" HorizontalAlignment="Left" FontSize="45" Background="Aquamarine" Margin="351,124,0,0" VerticalAlignment="Top" Width="154" Height="104"/>
</Grid>
</Window>
"@
# Load XAML elements into a hash table
$script:hash = [hashtable]::Synchronized(@{})
$hash.Window = [Windows.Markup.XamlReader]::Load((New-Object -TypeName System.Xml.XmlNodeReader -ArgumentList $xaml))
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | ForEach-Object -Process {
$hash.$($_.Name) = $hash.Window.FindName($_.Name)
}
# Create a stopwatch and a timer object
$Hash.Stopwatch = New-Object System.Diagnostics.Stopwatch
$Hash.Timer = New-Object System.Windows.Forms.Timer
$Hash.Timer.Enabled = $true
$Hash.Timer.Interval = 55
# Start button event
$hash.Start.Add_Click({
$Hash.Stopwatch.Start()
$Hash.Timer.Add_Tick({$Hash.Time.Text = "$($Hash.Stopwatch.Elapsed.Minutes.ToString("00")):$($Hash.Stopwatch.Elapsed.Seconds.ToString("00")):$($Hash.Stopwatch.Elapsed.Milliseconds.ToString("000"))"})
$Hash.Timer.Start()
})
# Stop button event
$hash.Stop.Add_Click({
if (!$Hash.Stopwatch.IsRunning) { return }
$Hash.Timer.Stop()
$Hash.Stopwatch.Stop()
})
# Reset button event
$hash.Reset.Add_Click({
if ($Hash.Stopwatch.IsRunning) { return }
$Hash.Stopwatch.Reset()
$Hash.Time.Text = "00:00:00"
})
# Display Window
$null = $hash.Window.ShowDialog()
Another way:
$Timer = new-object System.Windows.Threading.DispatcherTimer
$Timer.Interval = [TimeSpan]”0:0:1″
$Timer.Add_Tick({
[Payload]
})
$Timer.Start()
$Timer.Stop()
Hello Sir,
please tell me , how to display count down time in popup message and enable ok button to close form after count down reaches zero