2016年9月12日月曜日

【PowerShell】スクリーンショット(画面キャプチャ)

■Win10標準ショートカットキー
Win10では画面キャプチャ&ファイル保存してくれる以下のショートカットキーがあるので、もはやこのページの内容は不要となってしまった。(❖:Windowsロゴキー)

  • アクティブ画面キャプチャ+ファイル保存:❖+Alt+PrtSc
  • 全画面キャプチャ+ファイル保存    :❖+PrtSc
  • 指定範囲キャプチャ(ファイル保存しない) :❖+Shift+S
  • クリップボード履歴          :❖+V

※これらのショートカットキーはWin10のバージョンによって使えないものがあるようです。

話を戻して・・・
■PowerShellソース
$path = "c:\tmp\"                     # 出力先
$file = "Cap_{0:000}.png"             # {0:000} 0番目の引数を3桁の0埋め数字とする。

Add-Type -A System.Windows.Forms      # このセッションに型を追加。

[Windows.Forms.Screen]::PrimaryScreen.Bounds |                   # ディスプレイサイズを取得し、
    % {[Drawing.Bitmap]::New($_.Width, $_.Height)} |             # そのサイズのBitmapデータ生成。
    sv b                                                         # Set-Variable 変数への代入。bにBitmapオブジェクトを代入。

[Drawing.Graphics]::FromImage($b).CopyFromScreen(0, 0, $b.Size)  # 描画オブジェクトで画面キャプチャして、Bitmapデータへ反映。

md -f $path                           # フォルダ作成。-f:force 既に存在する場合エラーを抑止。

1..1000 |                             # 1~1000まで
    % { $path + $file -f $_ }  |      # 繰り返し、フォーマット。c:\tmp\Cap_001.pngなどに変換。
    ? { (Test-Path $_) -eq $false } | # その内、ファイルが存在しないパスのみを取得。
    select -F 1 |                     # 最初の1件のみにフィルタして、
    % { $b.Save($_) }                 # そのパスにBitmapデータをファイル保存。

Newスクリーンショット:上記に少し機能追加したもの。

■ショートカットキー
Win7以降ならタスクバーにピン留めしてWindowsキー+1とか2とか(タスクバーの左からのピン留め位置。ピン留めした位置が1番左なら、Windowsキー+1)。

■フリーソフトが使用できない職場なので、 WinShotも使用できない。仕方なく PowerShellでスクリーンキャプチャ&ファイル(画像ファイル)保存する。ちなみに全画面で保存される。

■Win7でも動くはず。
Download

上記のリンクからダウンロードした場合は、ファイルを右クリックしてプロパティを選択し、「ブロックの解除」が必要な場合がある。
上記のDownloadと下記のコードは同じもの。

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$filePath = "c:\tmp\Cap_{0:000}.png"
$fileKind = [System.Drawing.Imaging.ImageFormat]::Png
#$fileKind = [System.Drawing.Imaging.ImageFormat]::Jpeg
#$fileKind = [System.Drawing.Imaging.ImageFormat]::Gif
#$fileKind = [System.Drawing.Imaging.ImageFormat]::Bmp

# スクリーンキャプチャして、Graphicsオブジェクトを生成
$rect = [System.windows.forms.Screen]::PrimaryScreen.Bounds
$bitmap = New-Object System.Drawing.Bitmap($rect.Width, $rect.Height)

$graphics = [System.Drawing.Graphics]::FromImage($bitmap)
$zero = New-Object System.Drawing.Point(0, 0)
$graphics.CopyFromScreen($zero, $zero, $bitmap.Size)

# ファイル名を決定するために、存在しないファイルになるまでループ
$i = 0
do
{
    $path = $filePath -F $i # 文字列フォーマット
    $i++
} while (Test-Path $path);

# ファイル保存
$bitmap.Save($path, $fileKind)


■powershell画面を非表示にする。
1. 該当のps1ファイルを右クリックし、ショートカットの作成。
2. 作成したショートカットを右クリックし、プロパティ。

3. リンク先に【powershell.exe -w Hidden -ep RemoteSigned -c "C:\Users\root\Desktop\cap\cap.ps1"】を入力し、【OK】ボタン押下。パスは読み替えること。-ep RemoteSignedを指定した場合、後述のpowershellの有効化は不要。
4. ショートカットファイルをタスクバーにD&D。

上記手順後、タスクバーのpowershellアイコンをクリックするとpowershell画面非表示の状態でキャプチャされる。

■powershell 有効化
1. Winキー押下し、【powershell】と入力し、表示されたWindows PowerShellを右クリックし、「管理者として実行」を選択。

2.  【Set-ExecutionPolicy RemoteSigned】を入力。(Set-Ex入力後Tabで補完、Re入力後、Tabで補完)

■ショートカットキーの登録。(制限事項有り※)
  1. 上記のコードを保存または、リンクからDownload。
     例)c:\bat\スクリーンキャプチャ.ps1
  2. 保存したファイルを右クリック-「ショートカットの作成」を選択。
  3. 作成したショートカットファイルを選択し、Alt + Enterキー。
  4. 「リンク先」欄の先頭にpowershell を追加。
     例1)powershell C:\bat\スクリーンキャプチャ.ps1
     例2)C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe C:\bat\スクリーンキャプチャ.ps1
  5. 「ショートカットキー」欄を選択。
  6. 使用したいショートカットキーを押下。
     例)Ctrl + Alt + P。
  7. 「実行時の大きさ」欄を「最小化」に変更。
  8. Winロゴキー + Rキー押下。
  9. shell:startupを入力し、Enterキーを押下。
  10. エクスプローラが開くので、上記のショートカットファイルを移動。
  11. OS再起動。
※このショートカットキーの登録の場合、アクティブウィンドウが変更されてしまうため、ツールチップなどの一部の表示がキャプチャできないことがある。

1 件のコメント:

  1. ありがとうございます、とっても参考になりました!

    返信削除