如何在Windows PowerShell中捕获屏幕?我需要能够保存屏幕到磁盘。
9nvpjoqh1#
你也可以使用.NET来截图(这给了你更好的控制):
[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"
fkaflof62#
为了完成,这个脚本允许您在多个监视器上进行屏幕截图。基本代码来自Jeremy。
function screenshot($path) { [void] [Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $left = [Int32]::MaxValue $top = [Int32]::MaxValue $right = [Int32]::MinValue $bottom = [Int32]::MinValue foreach ($screen in [Windows.Forms.Screen]::AllScreens) { if ($screen.Bounds.X -lt $left) { $left = $screen.Bounds.X; } if ($screen.Bounds.Y -lt $top) { $top = $screen.Bounds.Y; } if ($screen.Bounds.X + $screen.Bounds.Width -gt $right) { $right = $screen.Bounds.X + $screen.Bounds.Width; } if ($screen.Bounds.Y + $screen.Bounds.Height -gt $bottom) { $bottom = $screen.Bounds.Y + $screen.Bounds.Height; } } $bounds = [Drawing.Rectangle]::FromLTRB($left, $top, $right, $bottom); $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(); }
它可以被称为:屏幕截图“D:\screenshot.png”
z0qdvdin3#
此PowerShell函数将捕获PowerShell中的屏幕并将其保存到自动编号的文件中。如果使用-OfWindow开关,则将捕获当前窗口。这是通过使用内置的PRINTSCREEN /CTRL-PRINTSCREEN技巧来实现的,它使用位图编码器将文件保存到磁盘。
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) } }
kq0g1dla4#
这是我的多显示器解决方案,比目前的答案简单一点。如果用户有一个奇怪的显示器配置(垂直堆叠等)没有黑条,它也会正确地呈现屏幕。
Add-Type -AssemblyName System.Windows.Forms,System.Drawing $screens = [Windows.Forms.Screen]::AllScreens $top = ($screens.Bounds.Top | Measure-Object -Minimum).Minimum $left = ($screens.Bounds.Left | Measure-Object -Minimum).Minimum $right = ($screens.Bounds.Right | Measure-Object -Maximum).Maximum $bottom = ($screens.Bounds.Bottom | Measure-Object -Maximum).Maximum $bounds = [Drawing.Rectangle]::FromLTRB($left, $top, $right, $bottom) $bmp = New-Object System.Drawing.Bitmap ([int]$bounds.width), ([int]$bounds.height) $graphics = [Drawing.Graphics]::FromImage($bmp) $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size) $bmp.Save("$env:USERPROFILE\test.png") $graphics.Dispose() $bmp.Dispose()
50pmv0ei5#
Microsoft在这里提供了一个PowerShell脚本:http://gallery.technet.microsoft.com/scriptcenter/eeff544a-f690-4f6b-a586-11eea6fc5eb8我刚刚在Windows 7机器上尝试了它,它可以工作,使用提供的命令行示例:
Take-ScreenShot -screen -file "C:\image.png" -imagetype png
5条答案
按热度按时间9nvpjoqh1#
你也可以使用.NET来截图(这给了你更好的控制):
fkaflof62#
为了完成,这个脚本允许您在多个监视器上进行屏幕截图。
基本代码来自Jeremy。
它可以被称为:屏幕截图“D:\screenshot.png”
z0qdvdin3#
此PowerShell函数将捕获PowerShell中的屏幕并将其保存到自动编号的文件中。如果使用-OfWindow开关,则将捕获当前窗口。
这是通过使用内置的PRINTSCREEN /CTRL-PRINTSCREEN技巧来实现的,它使用位图编码器将文件保存到磁盘。
kq0g1dla4#
这是我的多显示器解决方案,比目前的答案简单一点。如果用户有一个奇怪的显示器配置(垂直堆叠等)没有黑条,它也会正确地呈现屏幕。
50pmv0ei5#
Microsoft在这里提供了一个PowerShell脚本:
http://gallery.technet.microsoft.com/scriptcenter/eeff544a-f690-4f6b-a586-11eea6fc5eb8
我刚刚在Windows 7机器上尝试了它,它可以工作,使用提供的命令行示例: