2010-06-03 51 views

Respuesta

30

También puede utilizar .NET para tomar la captura de pantalla mediante programación (que le da un control más fino):

[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

Genial, ¿qué tan difícil sería conseguir que esto capturara la ventana? de una aplicación específica? Estoy creando una instancia de IE como esta: $ ie = new-object -com "InternetExplorer.Application" - ¿sería posible capturar solo el resultado de esta ventana, por ejemplo? – monojohnny

+0

Hace 7 años y aún funciona – hoangpx

8

Esta función de PowerShell capturará la pantalla en PowerShell y la guardará en un archivo numerado automáticamente. Si se usa el modificador -OfWindow, entonces se capturará la ventana actual.

Esto funciona mediante el uso de los trucos integrados PRINTSCREEN/CTRL-PRINTSCREEEN, y utiliza un codificador de mapa de bits para guardar el archivo en el disco.

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

Esperanza esto ayuda

+0

¿Hay pasos adicionales necesarios para conseguir que esto funcione en Windows 7? Recibo el siguiente error al ejecutar la función: "No se puede encontrar el tipo [Windows.Forms.Sendkeys]: asegúrese de que el ensamblaje que contiene este tipo esté cargado". y luego otro error "No se puede encontrar el tipo [Windows.Forms.Clipboard]: asegúrese de que el ensamblaje que contiene este tipo esté cargado". , y luego un error más (pero creo que porque las dos llamadas anteriores fallaron). – monojohnny

+1

Probablemente no haya cargado Winforms. Le recomendaría que simplemente descargue el módulo en el que se encuentra ahora esta respuesta: [RoughDraft] (http://gallery.technet.microsoft.com/RoughDraft-cfeb6e98) –

3

Microsoft tener un script de PowerShell disponible aquí:

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

Acabo de intentar i t en una máquina Windows 7 y que funcione, usando el ejemplo de comandos proporcionados:

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

¿Dónde coloca este archivo .ps1 para que no tenga que escribir toda la ruta de red? – Aaron

+0

@ Aaron, no estoy seguro de cómo hacer esto, pero probablemente lo configure en el perfil de Powershell (quizás editando la variable PATH o usando un alias): este artículo puede ayudar: http: //stackoverflow.com/questions/714877/setting-windows-powershell-path-variable – monojohnny

+2

Abrir con ... no produce ningún resultado. La entrada en la consola y luego invocarla tampoco produce entrada. Este es Windows 10 y este hilo ha estado aquí por años sin producir entradas. –

2

En aras de finalización, este script le permite tomar capturas de pantalla en varios monitores.

código base viene de 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() 
} 

puede ser llamada con: pantalla "D: \ screenshot.png"

Cuestiones relacionadas