PowerShellでスクリーンショットを撮る方法とその応用

PowerShellでスクリーンショットを撮る方法とその応用という問いには、撮影範囲を明示してBitmapとGraphicsを作成し、try/finallyでリソースを破棄しながらPNGへ保存するという方法で答えます。Graphics.CopyFromScreenは画面のピクセルをBitmapへコピーする。複数モニターではVirtualScreenの開始座標が負になる場合があり、固定の0,0だけでは欠落する。この記事ではVirtualScreenのX、Y、Width、Height、DPI条件と出力PNGの絶対パスを記録するを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。

画面録画ではなく、一回のピクセル取得をPNGへ安全に保存する。完了は「出力ファイルが存在し、画像の幅・高さが指定範囲と一致し、開いて必要な画面だけが写る」と定義します。対象が取れない場合は「ファイルが作られなければ対話セッション、保存権限、System.Drawing対応、RDPの画面状態を確認する」として切り分け、推測で成功扱いにしません。

目次

撮影範囲とDPIを決める

撮影範囲とDPIを決めるでは、PowerShellによるスクリーンショット保存の対象を「VirtualScreenのX、Y、Width、Height、DPI条件と出力PNGの絶対パスを記録する」という単位で扱います。Graphics.CopyFromScreenは画面のピクセルをBitmapへコピーする。複数モニターではVirtualScreenの開始座標が負になる場合があり、固定の0,0だけでは欠落する。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。

PowerShellによるスクリーンショット保存を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。

保存先が既存かを確認

撮影範囲を明示してBitmapとGraphicsを作成し、try/finallyでリソースを破棄しながらPNGへ保存する。PowerShellによるスクリーンショット保存ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。画面録画ではなく、一回のピクセル取得をPNGへ安全に保存する。

保存先が既存かを確認の合格条件は、出力ファイルが存在し、画像の幅・高さが指定範囲と一致し、開いて必要な画面だけが写ることです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。

System.Drawing型を読み込む

System.Drawing型を読み込むは変更前の基準点です。VirtualScreenのX、Y、Width、Height、DPI条件と出力PNGの絶対パスを記録するを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$bounds = [System.Windows.Forms.SystemInformation]::VirtualScreen
$desktop = [Environment]::GetFolderPath('Desktop')
$outputPath = Join-Path $desktop ("capture-{0}.png" -f (Get-Date -Format yyyyMMdd-HHmmss))
if ($bounds.Width -le 0 -or $bounds.Height -le 0) { throw 'VirtualScreenの寸法が無効です。' }
if (Test-Path -LiteralPath $outputPath) { throw "既存ファイルを上書きしません: $outputPath" }
[pscustomobject]@{ X=$bounds.X; Y=$bounds.Y; Width=$bounds.Width; Height=$bounds.Height; Output=$outputPath }

Graphics.CopyFromScreenは画面のピクセルをBitmapへコピーする。複数モニターではVirtualScreenの開始座標が負になる場合があり、固定の0,0だけでは欠落する。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。

CopyFromScreenで仮画像を作る

CopyFromScreenで仮画像を作るでは同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、出力ファイルが存在し、画像の幅・高さが指定範囲と一致し、開いて必要な画面だけが写るかどうかです。

$bitmap = $null
$graphics = $null
try {
  $bitmap = [System.Drawing.Bitmap]::new($bounds.Width, $bounds.Height)
  $graphics = [System.Drawing.Graphics]::FromImage($bitmap)
  $graphics.CopyFromScreen($bounds.Location, [System.Drawing.Point]::Empty, $bounds.Size)
  $bitmap.Save($outputPath, [System.Drawing.Imaging.ImageFormat]::Png)
} finally {
  if ($null -ne $graphics) { $graphics.Dispose() }
  if ($null -ne $bitmap) { $bitmap.Dispose() }
}
if (-not (Test-Path -LiteralPath $outputPath -PathType Leaf)) { throw 'PNGが保存されませんでした。' }

ファイルが作られなければ対話セッション、保存権限、System.Drawing対応、RDPの画面状態を確認する。PowerShellによるスクリーンショット保存の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。

PNG保存後に寸法を再取得

PNG保存後に寸法を再取得では、撮影範囲を明示してBitmapとGraphicsを作成し、try/finallyでリソースを破棄しながらPNGへ保存する。PowerShellによるスクリーンショット保存の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。

$image = $null
try {
  $image = [System.Drawing.Image]::FromFile($outputPath)
  $actualWidth = $image.Width
  $actualHeight = $image.Height
} finally {
  if ($null -ne $image) { $image.Dispose() }
}
if ($actualWidth -ne $bounds.Width -or $actualHeight -ne $bounds.Height) {
  throw ("保存寸法が不一致です: {0}x{1}" -f $actualWidth, $actualHeight)
}
$hash = Get-FileHash -LiteralPath $outputPath -Algorithm SHA256
[pscustomobject]@{
  Path=$outputPath; Width=$actualWidth; Height=$actualHeight
  ExpectedWidth=$bounds.Width; ExpectedHeight=$bounds.Height
  Sha256=$hash.Hash; ExactDimensions=$true
}

通知、パスワード、個人情報、他モニターを意図せず写さない。既存ファイルを無確認で上書きしない。PowerShellによるスクリーンショット保存でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。

複数モニターと負の座標

システム設定は変わらない。誤撮影ファイルは保管規程に従い、共有済みなら管理者へ連絡する。復旧操作にも同じ識別条件を使い、名前が似た別対象へ戻し処理を適用しません。

  • PowerShellによるスクリーンショット保存の変更前値と取得時刻
  • 復旧対象: VirtualScreenのX、Y、Width、Height、DPI条件と出力PNGの絶対パスを記録する
  • 復旧後の判定: 出力ファイルが存在し、画像の幅・高さが指定範囲と一致し、開いて必要な画面だけが写る
  • 再実行を止める条件: 通知、パスワード、個人情報、他モニターを意図せず写さない。既存ファイルを無確認で上書きしない

GraphicsとBitmapを必ず破棄

通知、パスワード、個人情報、他モニターを意図せず写さない。既存ファイルを無確認で上書きしない。GraphicsとBitmapを必ず破棄に該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。

ファイルが作られなければ対話セッション、保存権限、System.Drawing対応、RDPの画面状態を確認する。PowerShellによるスクリーンショット保存ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。

機密画面を写さない運用

自動撮影は同意と保存期間を明示し、無人セッションでは期待どおりの画面が得られないことを試験する。PowerShellによるスクリーンショット保存を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。

機密画面を写さない運用の識別軸VirtualScreenのX、Y、Width、Height、DPI条件と出力PNGの絶対パスを記録する
採用する実測出力ファイルが存在し、画像の幅・高さが指定範囲と一致し、開いて必要な画面だけが写る
0件時の扱いファイルが作られなければ対話セッション、保存権限、System.Drawing対応、RDPの画面状態を確認する
保留にする兆候通知、パスワード、個人情報、他モニターを意図せず写さない。既存ファイルを無確認で上書きしない

PowerShellによるスクリーンショット保存の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「VirtualScreenのX、Y、Width、Height、DPI条件と出力PNGの絶対パスを記録する」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。

PowerShellでスクリーンショットを撮る方法とその応用を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「出力ファイルが存在し、画像の幅・高さが指定範囲と一致し、開いて必要な画面だけが写る」、判定不能時は「ファイルが作られなければ対話セッション、保存権限、System.Drawing対応、RDPの画面状態を確認する」、中止時は「通知、パスワード、個人情報、他モニターを意図せず写さない。既存ファイルを無確認で上書きしない」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。

修正後コードの合格条件:保存先は時刻付きの新規PNGに限定し、既存パスなら撮影前に中止します。CopyFromScreenと保存はtry/finally内で行い、保存後に別のImageオブジェクトで幅・高さを読み直してVirtualScreenと完全一致した場合だけ完了です。

公式情報・参考資料

PowerShellによるスクリーンショット保存で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次