Stoppuhr mit PowerShell realisieren
Möchte man beispielsweise die Dauer einer Verarbeitung messen, kann nicht nur Measure-Command verwendet werden, sondern auch eine klassische Stoppuhr. Doch es ist kein eigenes PS Commandlet, sondern eher eine .NET Klasse auf die zugegriffen wird. Um also eine Stoppuhr mit PowerShell zu realisieren, wird System.Diagnostics.Stopwatch verwendet.
.NET Stoppuhr in PowerShell verwenden
Wie bei .NET Objekten in PowerShell gewohnt, muss erst eine Instanz der Stoppuhr erstellt werden. Das kann man mit folgendem Code erreichen:
$mystopwatch = [system.diagnostics.stopwatch]::StartNew()
Nun existiert ein neues Stopwatch-Objekt mit dem wir arbeiten können. Interessant ist nun, welche Befehle mit PowerShell abgesetzt werden können. Klassisch wäre für eine Stoppuhr das Starten, Anhalten und Zurücksetzen. Alle Methoden erhält man wie gewohnt mit Get-Member:
$mystopwatch | Get-Member
- Equals
- GetHashCode
- GetType
- Reset
- Restart
- Start
- Stop
- ToString
- Elapsed
- ElapsedMilliseconds}
- ElapsedTicks
- IsRunning
Methoden der Stoppuhr
Das PowerShell Cmdlet Get-Member gibt eine Liste an Methoden und Werte zurück, die mit der .NET Stoppuhr verwendet werden können. Doch was ist alles möglich?
Reset()
setzt die Stoppuhr auf 0 zurück.Restart()
macht eigentlich das Gleiche. Der Unterschied ist lediglich, dass beiReset()
die Uhr stehen bleibt und beiRestart()
die Uhr nach dem Zurücksetzen wieder weiterläuft.Start()
startet die Stopwatch, falls sie noch nicht läuft.Stop()
beendet die Stopwatch, falls diese derzeit läuft.- Mit
Elapsed()
wird die bereits verstrichene Zeit angezeigt. ElapsedMilliseconds()
zeigt die verstrichene Zeit in Millisekunden an.- Der Wert
IsRunning()
ist vom Typ Boolean und gibt True oder False zurück.
Mit diesen Methoden können auch in einem PowerShell Script die wichtigsten Methoden und Werte einer Stoppuhr verwendet werden. Anbei noch ein Beispiel, wie eine Solche in einem Script verwendet werden kann.
PowerShell Beispiel
Um in PowerShell eine Stoppuhr statt Measure-Command zu verwenden, wird die Uhr vor dem eigentlichen Befehl mit Start() gestartet, und nach dem Abarbeiten wieder mit Stop() gestoppt. Danach kann überprüft werden, wie lange der Befehl an Zeit benötigt hat. Elapsed() kann übrigens nur unter der Laufzeit verwendet werden, um die bisherige Dauer anzuzeigen.
In unserem Beispiel lassen wir den Inhalt des System32 Ordner auflisten:
# Objekt instanzieren $mystopwatch = [system.diagnostics.stopwatch]::StartNew() # Aufzeichnung starten $mystopwatch.Start() # Befehl, der den Inhalt von System32 auflistet Get-ChildItem 'C:\Windows\System32' -Recurse -Force # Stoppuhr stoppen $mystopwatch.Stop() # Dauer anzeigen $mystopwatch
An der Ausgabe kann man schön ablesen, dass die Verarbeitung etwas mehr als 21 Sekunden gedauert hat:
IsRunning : False Elapsed : 00:00:21.4656960 ElapsedMilliseconds : 21465 ElapsedTicks : 214656960