2010-06-03 7 views

Antwort

30

Sie auch .NET den Screenshot zu nehmen programmatisch nutzen können (die Sie eine feinere Kontrolle gibt):

[Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
function screenshot([Drawing.Rectangle]$bounds, $path) { 
    $bmp = New-Object Drawing.Bitmap $bounds.width, $bounds.height 
    $graphics = [Drawing.Graphics]::FromImage($bmp) 

    $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size) 

    $bmp.Save($path) 

    $graphics.Dispose() 
    $bmp.Dispose() 
} 

$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, 1000, 900) 
screenshot $bounds "C:\screenshot.png" 
+0

Großartig - wie schwer wäre es, das Fenster zu erfassen einer bestimmten Anwendung? Ich erstelle eine IE-Instanz wie folgt: $ ie = new-object -com "InternetExplorer.Application" - wäre es beispielsweise möglich, nur die Ausgabe dieses Fensters zu erfassen? – monojohnny

+0

vor 7 Jahren und immer noch arbeiten – hoangpx

8

Diese PowerShell-Funktion erfasst den Bildschirm in PowerShell und speichert ihn in einer automatisch nummerierten Datei. Wenn der Schalter -OfWindow verwendet wird, wird das aktuelle Fenster erfasst.

Dies funktioniert mit den integrierten PRINTSCREEN/STRG-PRINTSCREEEN-Tricks, und es verwendet einen Bitmap-Encoder, um die Datei auf der Festplatte zu speichern.

function Get-ScreenCapture 
{ 
    param( 
    [Switch]$OfWindow   
    ) 


    begin { 
     Add-Type -AssemblyName System.Drawing 
     $jpegCodec = [Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | 
      Where-Object { $_.FormatDescription -eq "JPEG" } 
    } 
    process { 
     Start-Sleep -Milliseconds 250 
     if ($OfWindow) {    
      [Windows.Forms.Sendkeys]::SendWait("%{PrtSc}")   
     } else { 
      [Windows.Forms.Sendkeys]::SendWait("{PrtSc}")   
     } 
     Start-Sleep -Milliseconds 250 
     $bitmap = [Windows.Forms.Clipboard]::GetImage()  
     $ep = New-Object Drawing.Imaging.EncoderParameters 
     $ep.Param[0] = New-Object Drawing.Imaging.EncoderParameter ([System.Drawing.Imaging.Encoder]::Quality, [long]100) 
     $screenCapturePathBase = "$pwd\ScreenCapture" 
     $c = 0 
     while (Test-Path "${screenCapturePathBase}${c}.jpg") { 
      $c++ 
     } 
     $bitmap.Save("${screenCapturePathBase}${c}.jpg", $jpegCodec, $ep) 
    } 
} 

this helps

+0

Gibt es zusätzliche Schritte erforderlich, um diese auf Windows 7 zu arbeiten? Beim Ausführen der Funktion wird der folgende Fehler angezeigt: "Typ [Windows.Forms.Sendkeys] kann nicht gefunden werden: Stellen Sie sicher, dass die Assembly, die diesen Typ enthält, geladen wird." und dann ein weiterer Fehler "Typ [Windows.Forms.Clipboard] kann nicht gefunden werden: Stellen Sie sicher, dass die Assembly, die diesen Typ enthält, geladen wird." , und dann noch ein Fehler (aber ich denke, weil die vorherigen zwei Anrufe fehlgeschlagen sind). – monojohnny

+1

Sie haben Winforms wahrscheinlich nicht geladen. Ich würde dir empfehlen, einfach das Modul herunterzuladen, auf das sich diese Antwort jetzt befindet: [RoughDraft] (http://gallery.technet.microsoft.com/RoughDraft-cfeb6e98) –

3

Microsoft ein Skript Powershell haben Sie hier:

http://gallery.technet.microsoft.com/scriptcenter/eeff544a-f690-4f6b-a586-11eea6fc5eb8

Ich habe gerade versucht ich t auf einem Windows-7-Maschine und damit arbeiten, in der Commandline am Beispiel bereitgestellt:

Take-ScreenShot -screen -file "C:\image.png" -imagetype png 
+0

Wo platzieren Sie diese .ps1-Datei, so dass Sie nicht den gesamten Netzwerkpfad eingeben müssen? – Aaron

+0

@Aaron, nicht ganz sicher, wie dies am besten zu tun ist - aber wahrscheinlich in Powershell-Profil (vielleicht entweder durch Bearbeiten der PATH-Variable oder mit einem Alias): Dieser Artikel kann helfen: http: //stackoverflow.com/questions/714877/setting-windows-powershell-pfadvariable – monojohnny

+2

Öffnen mit ... führt zu keinem Ergebnis. Die Eingabe in der Konsole, die sie dann aufruft, erzeugt auch keine Eingabe. Das ist Windows 10 und dieser Thread ist seit Jahren hier, ohne dass es Input gibt. –

2

Aus Gründen der Fertigstellung dieses Skript Sie Screenshots über mehrere Monitore nehmen können.

Basiscode stammt aus Jeremy

[Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
function screenshot($path) 
{ 
    $width = 0; 
    $height = 0; 
    $workingAreaX = 0; 
    $workingAreaY = 0; 

    $screen = [System.Windows.Forms.Screen]::AllScreens 

    foreach ($item in $screen) 
    { 
     if($workingAreaX -gt $item.WorkingArea.X) 
     { 
      $workingAreaX = $item.WorkingArea.X 
     } 

     if($workingAreaY -gt $item.WorkingArea.Y) 
     { 
      $workingAreaY = $item.WorkingArea.Y 
     } 

     $width = $width + $item.Bounds.Width; 

     if($item.Bounds.Height -gt $height) 
     { 
      $height = $item.Bounds.Height; 
     } 
    } 

    $bounds = [Drawing.Rectangle]::FromLTRB($workingAreaX, $workingAreaY, $width, $height) 
    $bmp = New-Object Drawing.Bitmap $width, $height 
    $graphics = [Drawing.Graphics]::FromImage($bmp) 

    $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size) 

    $bmp.Save($path) 

    $graphics.Dispose() 
    $bmp.Dispose() 
} 

kann mit dem heißen: Screenshot "D: \ screenshot.png"

Verwandte Themen