Powershellを活用したOutlook用C#プログラムの常駐実行スクリプト

PowerShellを使用して、Outlook用のC#プログラムを常駐実行させる方法について話しましょう。この方法は、特にデスクトップアプリケーションの自動化やバックグラウンドプロセスの管理に興味がある方にとって非常に有益です。

まず、このスクリプトはSystem.Windows.Forms, System.Drawing, そしてMicrosoft.Office.Interop.Outlookといったアセンブリに依存しています。これらはGUI要素の生成やOutlookの操作に不可欠なライブラリです。

スクリプトの核となるのは、CSVデータの読み込み、グリッドビューの表示、選択したデータのCSVへのエクスポート、そして最も重要な、Outlook用のC#プログラムの実行と再実行の機能です。

プログラム

実際のプログラムは下記です。

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName Microsoft.Office.Interop.Outlook

function getCSVData{

    $targetDataCsv = "C:\path\to\your\data.csv"

    $targetDataVal = Import-Csv $targetDataCsv -Encoding OEM -Header dataCol

    return $targetDataVal

}

function ShowGridView(){

    # フォームの設定
    $form = New-Object System.Windows.Forms.Form
    $form.Text = "GridViewサンプル"
    $form.Size = New-Object System.Drawing.Size(600, 400)

    # ボタンの追加と設定
    $button = New-Object System.Windows.Forms.Button
    $button.Text = "Export to CSV"
    $button.Dock = [System.Windows.Forms.DockStyle]::Bottom
    $button.Add_Click({ 
        ExportSelectedRowsToCSV
        $form.Dispose()
    })
    $form.Controls.Add($button)

    # DataGridViewの設定
    $dataGridView = New-Object System.Windows.Forms.DataGridView
    $dataGridView.Dock = 'Fill'
    $dataGridView.AllowUserToAddRows  = $false

    $columnCheckBox = New-Object System.Windows.Forms.DataGridViewCheckBoxColumn
    $columnCheckBox.HeaderText = "選択"
    $columnCheckBox.Name = "CheckBoxColumn"
    $columnCheckBox.Width = 50
    $dataGridView.Columns.AddRange($columnCheckBox)

    # DataGridViewに列を追加
    $column = New-Object System.Windows.Forms.DataGridViewTextBoxColumn
    $column.HeaderText = "Data Column"
    $column.Name = "dataCol"
    $column.AutoSizeMode = 'Fill'
    $column.ReadOnly = $true
    $dataGridView.Columns.Add($column)

    # CSVデータの読み込み
    $targetDataVal = getCSVData

    # DataGridViewに行を追加
    foreach ($record in $targetDataVal) {
        $row = $dataGridView.Rows.Add()
        $dataGridView.Rows[$row].Cells["dataCol"].Value = $record.dataCol
    }

    # 保存されたCSVデータの読み込み
    $savedData = Import-Csv -Path $global:saveCsvPath -ErrorAction SilentlyContinue

    # 保存されたデータと一致する行をチェックする
    if ($savedData) {
        foreach ($savedRow in $savedData) {
            foreach ($gridRow in $dataGridView.Rows) {
                if ($gridRow.Cells["dataCol"].Value -eq $savedRow.dataCol) {
                    $gridRow.Cells["CheckBoxColumn"].Value = $true
                    break
                }
            }
        }
    }

    # フォームにDataGridViewを追加して表示
    $dataGridView.DataSource
    $form.Controls.Add($dataGridView)
    $form.ShowDialog()

}

# 選択された行のデータをCSVファイルに出力する関数
function ExportSelectedRowsToCSV {
    $selectedRows = $dataGridView.Rows | Where-Object { $_.Cells["CheckBoxColumn"].Value -eq $true }

    $dataTable = New-Object System.Data.DataTable
    foreach ($column in $dataGridView.Columns) {
        if ($column.Name -ne "CheckBoxColumn") {
            $dataTable.Columns.Add($column.Name)
        }
    }

    foreach ($row in $selectedRows) {
        $newRow = $dataTable.NewRow()
        foreach ($column in $dataGridView.Columns) {
            if ($column.Name -ne "CheckBoxColumn") {
                $newRow[$column.Name] = $row.Cells[$column.Name].Value
            }
        }
        $dataTable.Rows.Add($newRow)
    }

    $dataTable | Export-Csv -Path $global:saveCsvPath -NoTypeInformation
}

function startProgram{

    # 保存されたCSVデータの読み込み
    $savedData = Import-Csv -Path $global:saveCsvPath -ErrorAction SilentlyContinue
    $rec = $null
    # 保存されたデータと一致する行をチェックする
    if ($savedData) {
        foreach ($savedRow in $savedData) {
            foreach ($gridRow in $targetDataVal) {
                if ($gridRow.dataCol -eq $savedRow.dataCol) {
                    $cur = $savedRow.dataCol
                    $cur = [string]::Concat( '"' ,  $cur)
                    $cur = [string]::Concat( $cur, '"')
                    # 各データ項目を引用符で囲み、空白で区切る
                    if ([string]::IsNullOrEmpty($rec)){
                        $rec = $cur
                    }else{
                        $rec = $rec + " " + $cur
                    }
                    break
                }
            }
        }
    }

    $argsVal = $rec
    #実行対象プログラムのパスを設定する
    $targetProgram = "C:\path\to\your\OutlookAddInEX.exe"

    # ジョブとしてプロセスを開始
    if ([string]::IsNullOrEmpty($argsVal)){

        Write-Host "引数なし"
        $global:outlookAddInPgJob =  Start-Process  $targetProgram  -PassThru -NoNewWindow
    
    }else{

        $argsVal = [string]::Concat("'" , $argsVal)
        $argsVal  = [string]::Concat($argsVal, "'")
        Write-Host $argsVal
        $global:outlookAddInPgJob =  Start-Process  $targetProgram -ArgumentList $argsVal -PassThru -NoNewWindow

    }
    
    return $global:outlookAddInPgJob 

}

# タスクトレイアイコンを作成
$notifyIcon = New-Object System.Windows.Forms.NotifyIcon
$notifyIcon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon((Get-Command $MyInvocation.MyCommand.Definition).Source)
$global:saveCsvPath = "C:\path\to\your\exported.csv" 

# タスクトレイアイコンに関連するコンテキストメニューを作成
$contextMenu = New-Object System.Windows.Forms.ContextMenu
$menuItemExit = New-Object System.Windows.Forms.MenuItem
$menuItemExit.Text = "Exit"
$menuItemExit.Add_Click({
    #プログラムのプロセスを停止する
    $global:outlookAddInPgJob.kill()
    $global:outlookAddInPgJob.Dispose()
    # スクリプトの終了処理をここに追加
    $notifyIcon.Dispose()
    [System.Windows.Forms.Application]::Exit()
})

# タスクトレイアイコンをクリックしたときのイベントハンドラを修正
$notifyIcon.add_MouseClick({
    param($sender, $e)

    # イベントが左クリックであるかをチェック
    if ($e.Button -eq [System.Windows.Forms.MouseButtons]::Left) {

        ShowGridView
        #プログラムのプロセスを停止する
        $global:outlookAddInPgJob.kill()

        #再度プログラムを実行する
        $global:outlookAddInPgJob = startProgram
    }

})

$contextMenu.MenuItems.Add($menuItemExit)
$notifyIcon.ContextMenu = $contextMenu

# タスクトレイアイコンを表示
$notifyIcon.Visible = $true
$targetDataVal = $null
$targetDataVal = getCSVData

$global:outlookAddInPgJob = startProgram

# スクリプトが終了するまで待機
[System.Windows.Forms.Application]::Run()

主要機能の概要

  1. CSVデータの読み込み: スクリプトは特定のCSVファイルからデータを読み込み、これを後続のプロセスで使用します。
  2. グリッドビューの表示: ユーザーはGUI上でデータを確認し、必要な項目を選択できます。これは視覚的なフィードバックと操作性を提供します。
  3. 選択された行のCSVエクスポート: ユーザーが選択した行は、CSVファイルにエクスポートされ、このデータはOutlookプログラムの入力として使用されます。
  4. Outlook用プログラムの実行: エクスポートされたCSVデータを引数として、Outlook用のC#プログラムがバックグラウンドで実行されます。
  5. タスクトレイアイコンの活用: スクリプトはタスクトレイアイコンを介してユーザーに対話機能を提供します。これにより、プログラムの再実行や終了などの操作が可能になります。

実装の詳細

  • GUIのカスタマイズ: System.Windows.Formsを利用して、ユーザーフレンドリーなインターフェイスを構築しています。これにより、非技術的なユーザーでも簡単に操作できるようになっています。
  • データの管理と処理: CSVファイルからのデータ読み込み、加工、そしてエクスポートのプロセスは、データ管理の自動化において非常に有効です。
  • Outlookプログラムの連携: Microsoft.Office.Interop.Outlookを使用してOutlookとの連携を実現しており、Eメール管理やカレンダー操作などの自動化が可能です。
  • バックグラウンド処理の最適化: スクリプトはプログラムをバックグラウンドで実行し、最小限の介入で最大限の効果を発揮します。

まとめ

このスクリプトは、PowerShellを活用してOutlook用のC#プログラムを効率的に管理する方法の一例です。この方法は、日常の作業を自動化し、生産性を向上させたいビジネスユーザーや開発者にとって非常に役立つでしょう。

最後に、このスクリプトはカスタマイズが可能ですので、特定のニーズに合わせて調整することができます。自動化の世界において、これは一つの大きなステップになるはずです。

スポンサーリンク

-IT関連
-