2016年9月3日土曜日

【PowerShell】フォルダ内の最新画像を表示

ネット接続できない職場なので、基本的にスクリプトを自作する必要がある。
エクスプローラで画像表示することも可能だが、カスタマイズできるように
スクリプト化。

Download

#==================================================================
# ツールの概要
#==================================================================
# 一定間隔で指定フォルダの最新の画像ファイルを表示する。
# ウィンドウをクリックした場合も最新の画像ファイルを表示する。
# ウィンドウをダブルクリックするとウィンドウが画像にフィットする。

#==================================================================
# 事前準備
#==================================================================
# 管理者権限でpowershellを開き、実行ポリシーを変更しておく。
# Window 8の場合
# 1. キーボードでWindowsキー押下。
# 2. キーボードでpowershellと入力。
# 3. Shift-Ctrlを押しながら、powershellアイコンをクリック。
# 4. キーボードでSet-ExecutionPolicy RemoteSignedと入力。

#==================================================================
# 使用方法
#==================================================================
# このテキストをコピーしてファイルに保存。拡張子はps1とする。
# 下記の「設定値」欄を変更し、powershellからps1ファイルを実行。
# Windows8の場合はファイルを右クリックして「PowerShellで実行」を選択。

#==================================================================
# ライセンス
#==================================================================
# Copyright (c) 2015 Barracuda sh
# This software is released under the MIT License.
# http://opensource.org/licenses/mit-license.php

#==================================================================
# 設定値
#==================================================================
$pictDirPath = "C:\tmp"
$fileExt = @("*.gif", "*.jpg", "*.jpeg", "*.png", "*.bmp")
$interval = 2000
$width = 480
$height = 320
#$DebugPreference = "Continue"

#==================================================================
# メイン処理
#==================================================================
# コンソールを非表示
PowerShell -WindowStyle Hidden -Command Exit

# アセンブリ読み込み
Add-Type -Assembly System.Windows.Forms
Add-Type -Assembly System.Drawing

# Formサイズ(=画像サイズ)
$size = New-Object System.Drawing.Point
$size.X = $width
$size.Y = $height

# Form生成
[System.Windows.Forms.Form]$mainForm = New-Object System.Windows.Forms.Form
$mainForm.ClientSize = $size

# PictureBoxを生成しFormへ追加
[System.Windows.Forms.PictureBox]$pictBox = New-Object System.Windows.Forms.PictureBox
$pictBox.Sizemode = [System.Windows.Forms.PictureBoxSizeMode]::Zoom
$pictBox.AutoSize = $false
$pictBox.Size = $size
$pictBox.anchor = `
    [System.Windows.Forms.AnchorStyles]::Top -bor `
    [System.Windows.Forms.AnchorStyles]::Bottom -bor `
    [System.Windows.Forms.AnchorStyles]::Left -bor `
    [System.Windows.Forms.AnchorStyles]::Right 
$mainForm.Controls.Add($pictBox)

#タイマーイベントコールバック関数
$tick = {
    Write-Debug "[イベント]タイマー"
    # 画像表示を行う
    updatePict $script:mainForm $script:pictBox $script:pictDirPath $script:fileExt $false
}

# ピクチャーボックスクリックイベントコールバック関数
$click = {
    Write-Debug "[イベント]クリック"
    # 強制画像表示を行う
    updatePict $script:mainForm $script:pictBox $script:pictDirPath $script:fileExt $true
}

# ピクチャーボックスクリックイベントコールバック関数 
$doubleClick = {
    Write-Debug "[イベント]ダブルクリック"
    $widthRatio  = $pictBox.Size.Width  / $pictBox.Image.Size.Width
    $heightRatio = $pictBox.Size.Height / $pictBox.Image.Size.Height

    Write-Debug ("width  ratio = " + $widthRatio)
    Write-Debug ("height ratio = " + $heightRatio)

    if ($widthRatio -le $heightRatio)
    {
        [int]$newWidth  = $script:mainForm.ClientSize.Width
        [int]$newHeight = $script:pictBox.Image.Height * $widthRatio + 1
    }
    else
    {
        [int]$newWidth  = $script:pictBox.Image.Width * $heightRatio + 1
        [int]$newHeight = $script:mainForm.ClientSize.Height
    }
    $script:mainForm.ClientSize = New-Object System.Drawing.Size($newWidth, $newHeight)
}

# 画像更新関数
function updatePict ([System.Windows.Forms.Form]$form, [System.Windows.Forms.PictureBox]$pictBoxObj, [string]$path, [array]$ext, [bool]$force) {
    Write-Debug ("path = " + $path)
    Write-Debug ("ext = " + $ext)
    Write-Debug ("force = " + $force)

    # ファイル一覧を取得
    $path = $path + "\*.*"
    $sortFileAry = (Get-ChildItem $path -include $ext | sort CreationTime -Desc)

    # ファイル数が0なら終了
    if ($sortFileAry.Length -eq 0)
    {
        $pictBoxObj.ImageLocation = ""
        $form.Text = ""
        return
    }

    # 最新のファイルのパスを取得
    $latest = $sortFileAry[0].FullName

    # CPU・HDD負荷低減のため、前回と同じファイルパスの場合は画像表示をスキップ。
    if (!$force) {
        if ($pictBoxObj.ImageLocation -eq $latest)
        {
            Write-Debug "更新無"
            return
        }
    }

    # 前回と違うファイルパスの場合は、画像ファイルを表示する。 
    $pictBoxObj.ImageLocation = $latest
    $form.Text = $latest
    Write-Debug $latest
}

# PictureBoxのクリックイベント登録
$pictBox.Add_Click($click)
$pictBox.Add_DoubleClick($doubleClick)

# タイマー生成
$timer = New-Object Windows.Forms.Timer
$timer.Interval = $interval
$timer.Add_Tick($tick)
$timer.Enabled = $true

# 初回画像表示
updatePict $script:mainForm $pictBox $pictDirPath $script:fileExt $true

# メインフォームを表示
$mainForm.ShowDialog()

# タイマーを終了。
$timer.Enabled = $false

0 件のコメント:

コメントを投稿