Come posso eseguire una cattura dello schermo in Windows PowerShell?

Come posso acquisire lo schermo in Windows PowerShell? Devo essere in grado di salvare lo schermo su disco.

Puoi anche usare .NET per prendere lo screenshot in modo programmatico (il che ti dà un controllo più fine):

[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" 

Questa funzione di PowerShell cattura lo schermo in PowerShell e lo salva in un file numerato automaticamente. Se si utilizza l’opzione -OfWindow, verrà acquisita la finestra corrente.

Funziona utilizzando i trucchi PRINTSCREEN / CTRL-PRINTSCREEEN e utilizza un codificatore bitmap per salvare il file sul 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) } } 

Spero che questo ti aiuti

Per completezza, questo script ti permette di fare screenshot su più monitor.

Il codice base proviene da 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(); } 

Può essere chiamato con: screenshot “D: \ screenshot.png”

Microsoft ha uno script PowerShell disponibile qui:

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

Ho appena provato su una macchina Windows 7 e funziona, utilizzando l’esempio della riga di comando fornito:

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