PowerShellでクリップボードの画像を保存する

クリップボードに入っている画像をファイルに保存するサンプル。クリップボードに画像が含まれていなければ何も動作しない。保存されたかどうか音でお知らせする機能付き。サンプルとしてPNGで保存するようにしているけど、3行目のオブジェクトの指定を変更すれば他の形式でも保存できる。その場合はファイル名の拡張子も変更するのを忘れないように。ファイル名は"年月日時分秒.png"の形式で保存する。また、保存場所のパスも環境に合わせて変更する。
If ([System.Windows.Clipboard]::ContainsImage() -eq $True) {
  $Image = [System.Windows.Clipboard]::GetImage();
  $Bitmap = New-Object System.Windows.Media.Imaging.PngBitmapEncoder;
  $Bitmap.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($Image));
  $FileName = "C:\Screenshot\" + (Get-Date -Format "yyyyMMddHHmmss") + ".png";
  $Stream = New-Object System.IO.FileStream -ArgumentList $FileName, 'Create', 'Write'
  $Bitmap.Save($Stream);
  $Stream.Close();
  [Console]::Beep(1000, 300)
}
Else {
  [Console]::Beep(500, 300)
}
JPEGで保存するとき
$Bitmap = New-Object System.Windows.Media.Imaging.JpegBitmapEncoder;
$FileName = <中略> + ".jpg"

TIFFで保存するとき
$Bitmap = New-Object System.Windows.Media.Imaging.TiffBitmapEncoder;
$FileName = <中略> + ".tif"

BMPで保存するとき
$Bitmap = New-Object System.Windows.Media.Imaging.BmpBitmapEncoder;
$FileName = <中略> + ".bmp"
改訂版
(2016-12-10追記) 上の方法はPowerShell ISEの環境でしか実行できないので、コマンドプロンプトから実行する場合は以下の通り。
Add-Type -AssemblyName System.Drawing, System.Windows.Forms

If ([Windows.Forms.Clipboard]::ContainsImage() -eq $True) {
  $FileName = "C:\Screenshot\" + (Get-Date -Format "yyyyMMddHHmmss") + ".png";
  $Image = [Windows.Forms.Clipboard]::GetImage();
  $Image.Save($FileName, [System.Drawing.Imaging.ImageFormat]::Png);
  [Console]::Beep(1000, 300)
}
Else {
  [Console]::Beep(500, 300)
}
    この記事で書かれている製品やソフトについて
  • Windows10 Pro 64ビット
  • PowerShell 5.1.14393.479