How can I do a screen capture in Windows PowerShell?

前端 未结 5 439
礼貌的吻别
礼貌的吻别 2020-11-28 05:51

How can I capture the screen in Windows PowerShell? I need to be able to save the screen to disk.

相关标签:
5条回答
  • 2020-11-28 06:19

    Here is my solution for multi-monitor, which is a bit simpler than the current answer. It also will render screens properly if the user has a strange monitor config (stacked vertical, etc) without black bars.

    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
    $width  = ($screens.Bounds.Right  | Measure-Object -Maximum).Maximum
    $height = ($screens.Bounds.Bottom | Measure-Object -Maximum).Maximum
    
    $bounds   = [Drawing.Rectangle]::FromLTRB($left, $top, $width, $height)
    $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()
    
    0 讨论(0)
  • 2020-11-28 06:20

    For the sake of completion, this script allows you to take screenshots across multiple monitors.

    Base code comes from 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();
    }
    

    Can be called with: screenshot "D:\screenshot.png"

    0 讨论(0)
  • 2020-11-28 06:24

    Microsoft have a Powershell script available here:

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

    I have just tried it on a Windows 7 machine and it to work, using the commandline example provided:

    Take-ScreenShot -screen -file "C:\image.png" -imagetype png 
    
    0 讨论(0)
  • 2020-11-28 06:33

    You can also use .NET to take the screenshot programatically (which gives you finer control):

    [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 讨论(0)
  • 2020-11-28 06:35

    This PowerShell function will capture the screen in PowerShell and save it to an automatically numbered file. If the -OfWindow switch is used, then the current window will be captured.

    This works by using the built in PRINTSCREEN / CTRL-PRINTSCREEEN tricks, and it uses a bitmap encoder to save the file to disk.

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

    Hope this helps

    0 讨论(0)
提交回复
热议问题