Windows PowerShell에서 화면 캡처를 수행하려면 어떻게 해야 합니까?
Windows PowerShell에서 화면을 캡처하려면 어떻게 해야 합니까?화면을 디스크에 저장할 수 있어야 합니다.
를 사용할 수도 있습니다.스크린샷을 프로그래밍 방식으로 촬영하는 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"
이 스크립트를 사용하면 여러 모니터에서 스크린샷을 촬영할 수 있습니다.
기본 코드는 제레미에게서 왔습니다.
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"
이 PowerShell 기능은 화면을 PowerShell에 캡처하여 자동으로 번호가 지정된 파일에 저장합니다.-Of Window 스위치를 사용하면 현재 창이 캡처됩니다.
이것은 내장된 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)
}
}
여기 현재 답변보다 조금 더 간단한 멀티 모니터 솔루션이 있습니다.또한 사용자가 검은색 막대가 없는 이상한 모니터 구성(수직으로 쌓인 것 등)을 가지고 있는 경우에도 화면이 올바르게 렌더링됩니다.
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()
Microsoft는 다음 사이트에서 PowerShell 스크립트를 사용할 수 있습니다.
http://gallery.technet.microsoft.com/scriptcenter/eeff544a-f690-4f6b-a586-11eea6fc5eb8
Windows 7(윈도우 7) 컴퓨터에서 사용해 본 결과 다음과 같은 명령줄 예제를 사용하여 작동했습니다.
Take-ScreenShot -screen -file "C:\image.png" -imagetype png
언급URL : https://stackoverflow.com/questions/2969321/how-can-i-do-a-screen-capture-in-windows-powershell
'programing' 카테고리의 다른 글
html "선택" 요소의 옵션을 스타일화하는 방법은 무엇입니까? (0) | 2023.08.10 |
---|---|
ASP.NET MVC - 역할 제공자의 대안? (0) | 2023.08.10 |
JSON_ARRAY가 마리아에 대한 빈 목록을 보내지 않음DB (0) | 2023.08.10 |
지원 라이브러리 26.0.0으로 업데이트할 때 지정된 이름과 일치하는 리소스를 찾을 수 없습니다. (0) | 2023.08.10 |
장고에서 단일 쿼리 세트로 레코드를 선택하고 업데이트하는 방법은 무엇입니까? (0) | 2023.08.10 |