Screenshots erstellen mit der PowerShell


Tags: ,
I like Google Plus

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, das ich über eine schnelle Webrecherche gefunden habe, 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 vorgestellte Funktion per Copy&Paste in ein Skript einfügt und daraus eventuell ein Modul macht, dass per 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.

3 Kommentare

Bild von Gast
Gast (Besucher) sagt:

Läuft anscheinend leider erst ab Powershell 3.0 !

Bild von Gast
Gast (Besucher) sagt:

nein, liegt denke ich eher an .net Framework 4, geht mit POSH 2

Bild von Peter Monadjemi

>>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;)

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht angezeigt. Wenn mit Ihrer angegebenen Mail-Adresse ein Gravatar verknüpft ist, dann wird dieser neben Ihrem Kommentar eingeblendet.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Zeilen und Absätze werden automatisch erzeugt.
  • Mail-Adressen werden im Seitenquelltext unkenntlich gemacht, um sie vor dem automatischen Erfassen durch Spammer zu schützen.

Weitere Informationen über Formatierungsoptionen