2016年12月23日金曜日

【PowerShell】スクリーンショット2

■フリーソフトが使用できない職場なので、 WinShotも使用できない。仕方なく、 PowerShellでスクリーンキャプチャする。 
少し改良したので再掲
##########################################################################################
# 注意事項
#  ・ドライブ直下のフォルダ(例えばc:\tmpなど)は権限が無いため、
#    本スクリプトでは作成できないことがあります。事前に作成して下さい。
#  ・実行ポリシーが変更されていない場合、(Set-ExecutionPolicy RemoteSigned等)が必要です。
##########################################################################################
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# 出力先ファイルパス
$filePath = "c:\tmp\evi\C{0:000}.png"
#$filePath = "c:\tmp\evi\" + $(Get-Date).ToString("yyyyMMdd") + "\C{0:000}.png"

# Jpeg,Gif,Bmp,Pngから選択する。
$fileKind = [System.Drawing.Imaging.ImageFormat]::Png

# スクリーンキャプチャして、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)

# フォルダ作成、フォルダがすでに存在するエラーは非表示。他のエラーも黙らせるので注意。
$dirPath = Split-Path $filePath -parent
New-Item -path $dirPath -type directory -ErrorAction SilentlyContinue

# ファイル名を決定。順に、以下の処理を行う。
# 1000までの数字を生成、ファイル名をフォーマットに従い決定、ファイルが存在するかチェック、最初の1件を取得、変数に格納を行う。
1..1000 | % { $filePath -f $_ }  | Where { (Test-Path $_) -eq $false } | select -First 1 | sv resultFile

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

##########################################################################################
# ファイル作成後処理。フォルダやファイルを開く。必要に応じて、コメントアウトする。
##########################################################################################
$shell = New-Object -ComObject Shell.Application # explorer ieの一覧を取得

#============================================================================
# 拡張子に対する既定のアプリケーションで開く。
#============================================================================
#ii $resultFile

#============================================================================
# ペイントで開く。
#============================================================================
#mspaint $resultFile

#============================================================================
# IEで開く。(毎回新しいウィンドウで開く。)
#============================================================================
#$ieCom = New-Object -ComObject InternetExplorer.Application  # IEで開く。
#$ieCom.Navigate($resultFile)
#$ieCom.Visible = $true

#============================================================================
# IEで開く。初回のみIEを1つ開き、2回目以降はウィンドウを更新する。
#============================================================================
# 対象のウィンドウのみ取得。
$ie = $null
$locationURL = "file:///" + $dirPath.Replace("\", "/")
$shell.windows() | where {($_.LocationURL -like $locationURL + "*") -and ($_.Name -eq "Internet Explorer")} | select -First 1 | sv ie

# オープン済みのIEが取得できなかった場合は、IEを開く。
if ($ie -eq $null)
{
    $ie = New-Object -ComObject InternetExplorer.Application
    $ie.Width = 700
    $ie.Height = 300
    $ie.Left = 1000
    $ie.top = 300
    $ie.AddressBar = $false
}

# IEで作成したファイルを開く。
$ie.Navigate($resultFile)
$ie.Visible = $true

#============================================================================
# エクスプローラを開く。
#============================================================================
$exp = $null
$locationURL = "file:///" + $dirPath.Replace("\", "/")
$shell.windows() | where {($_.LocationURL -like $locationURL) -and ($_.Name -eq "エクスプローラー")} | select -First 1 | sv exp
if ($exp -eq $null)
{
    Start "explorer " -Args $dirPath -Wait
    $shell.windows() | where {($_.LocationURL -like $locationURL) -and ($_.Name -eq "エクスプローラー")} | select -First 1 | sv exp

    $exp.Width = 700
    $exp.Height = 300
    $exp.Left = 1000
    $exp.top = 0
    $exp.AddressBar = $false
    $exp.Document.SortColumns = "prop:System.DateModified;"
    $exp.Document.CurrentViewMode = 5
    $exp.Document.IconSize = 150
}

$exp.Refresh2()

0 件のコメント:

コメントを投稿