Tags: PowerShell, Reporting
Für die Fehlerbeschreibung ist ein Bildschirmfoto oft das aussagekräftigste "Beweismittel". Zwar gibt es (mit Sicherheit) zahlreiche Freeware-Tools, mit denen sich ein solcher "Screenshot" per Kommandozeile und damit auch aus einem PowerShell-Skript heraus anfertigen lässt (ein Tool ist Import aus der ImageMagick Library - http://www.imagemagick.org/script/import.php).
Ein "Eigenbau" ist aber auch nicht allzu kompliziert und ein weiteres anschauliches Beispiel dafür, wie einfach es ist, die umfangreiche Funktionalität der .NET-Laufzeit in ein Powershell-Skript einzubeziehen, ohne dabei (und darauf kommt es an) zum "Entwickler" werden zu müssen.
Wer die hier vorgestellte Funktion per Copy&Paste in ein Skript einfügt und daraus eventuell ein Modul macht, dass mit dem Befehl Import-Module im Profilskript geladen wird, erhält einen neuen Befehl, der mit dem jedem PowerShell-Start zur Verfügung steht.
Genug der Vorrede, die Funktion Get-Screenshot, die im Folgenden vorgestellt wird, fertigt einen Screenshot des kompletten Bildschirms an (der Bereich kann natürlich variiert werden) und legt diesen als Bitmap im PNG-Format im Documents-Ordner des Benutzerprofils ab.
Die Funktion benutzt dafür verschiedenene Klassen im Namespace System.Drawing, die alle sehr einfach sind und keinerlei Detailkenntnisse voraussetzen.
Die Funktion wurde bewusst sehr einfach gehalten. Möchte man z.B. nur das aktive Fenster "fotografieren", wäre dies natürlich ebenfalls machbar, aber der Aufwand wäre deutlich größer. Der Reize der vorgestellten Lösung besteht in ihrer Einfachheit.
<#
.Synopsis
Fertigt einen Screenshot an
.Description
Speichert den Screenshot als Png-Datei im Documents-Verzeichnis
#>
Add-Type -Assembly System.Drawing
function Get-Screenshot
{
param([System.Drawing.Rectangle]$Bereich,[Switch]$Show=$true)
# Leere Bitmap anlegen
$Bmp = New-Object System.Drawing.Bitmap $Bereich.Width, $Bereich.Height
# Graphics-Objekt anlegen
$Graphics = [System.Drawing.Graphics]::FromImage($Bmp)
# Bildschirm in das Graphics-Objekt kopieren
$Graphics.CopyFromScreen($Bereich.Location, [System.Drawing.Point]::Empty,$Bereich.Size)
# Bitmap-Pfad festlegen
$BmpPath = "$env:userprofile\documents\Screenshot_{0:dd}{0:MM}_{0:HH}_{0:mm}_{0:ss}.png" -f (Get-Date)
# Bitmap speichern
$Bmp.Save($BmpPath)
# Objekte aufräumen (der Form halber)
$Graphics.Dispose()
$Bmp.Dispose()
# Soll die Bitmap angezeigt werden?
if ($Show)
{ Invoke-Item -Path $BmpPath }
}
Aufgerufen wird die Funktion we folgt:
$Bereich = [System.Drawing.Rectangle]::FromLTRB(0, 0, 1000, 900)
Get-Screenshot -Bereich $Bereich
Die Variable $Bereich definiert dabei die größe des Bildschirmfotos - in diesem Beispiel wurde willkürlich eine Größe von 1000 x 900 Pixeln festgelegt.
Wer über etwas Entwickler-Know-how verfügt und sich ein wenig im Umang mit den verwendeten Bitmap-Klassen der .NET-Klassenbibliothek auskennt, kann Details verändern und z.B. anstelle von Png das kompaktere JPG-Format verwenden.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Active Directory: Gruppen und ihre Mitglieder als CSV-Report speichern mit PowerShell
- ConvertTo-Html: HTML-Reports erstellen in PowerShell
- PowerShell für Logon-Scripts verwenden
- Dateien zwischen Windows und Linux kopieren mit SCP und PowerShell
- Hyper-V Switch mit PowerShell erstellen, verwalten und löschen
Weitere Links
5 Kommentare
Läuft anscheinend leider erst ab Powershell 3.0 !
nein, liegt denke ich eher an .net Framework 4, geht mit POSH 2
>>Läuft anscheinend leider erst ab Powershell 3.0 !
Nein, diese Version ist noch gar nicht offiziell;)
Das kleine Skript setzt PowerShell 2 (aber auch nur wegen dem Add-Type-Cmdlet, das man auch ersetzen könnte) voraus.
PS: Ich möchte mich bei dieser Gelegenheit für die zahlreichen Tippfehler in dem Original-Beitrag entschuldigen, die das Lesen sicher etwas erschwert haben (es ist ja nicht mehr so, dass Online-Zeit im Minutentakt abgerechnet wird - man kann die Texte daher in aller in Ruhe noch einmal lesen und verändern;)
Vielen Dank für den Beitrag. Ich habe an einem Rechner zwei Bildschirme, an einem anderen nur einen.
Wie kann ich das Script so aufrufen, dass nur der zweite Bildschirm aufgenommen wird und zwar -je nach Auflösung- der ganze Bildschirm ?
Sehr interessant, prima!
Ich würde gern diesen Screeshot von einer Webseite machen ohne diese nun wirklich sichtbar darzustellen. Das heißt, es soll regelmäßig im Hintergrund ein Screenshot einer Webseite gespeichert werden.
Gäbe es da eine Möglichkeit via PowerShell?
Danke, Gruß
Karl