PowerShellで簡単にGUIを作成する

Tips

はじめに

普段の開発では WSL を使用していますが、たまに Windows 環境側で作業を行うことがあります。 そんなとき、PowerShell でも Windows Forms を使って簡単に GUI を作成し、ユーザーの入力を処理できることを知ったので、その方法をまとめます。

本記事では以下の3つの使用例を紹介します。

  • 入力フォーム
  • テーブル形式でのデータ表示
  • エクスプローラーでのファイル・フォルダ選択

事前準備

PowerShell で Windows Forms を使用するには、Add-Type コマンドで System.Windows.Forms アセンブリを読み込む必要があります。

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

これ以降のコードはこの2行を先頭に記述することを前提とします。

スクリプトファイルの文字コードに注意

スクリプトを .ps1 ファイルとして保存する場合、UTF-8 BOM 付きで保存しないと文字化けやエラーが発生することがあります。

特に日本語などのマルチバイト文字を含むスクリプトでは、BOM なし UTF-8 で保存すると実行時にエラーになるケースがあります。

VS Code を使用している場合は、右下のエンコーディング表示をクリックして「UTF-8 with BOM」を選択して保存してください。 メモ帳(Windows 11)でも保存ダイアログのエンコードで「UTF-8 (BOM 付き)」を選択できます。

入力フォーム

テキストボックスとボタンを配置したシンプルな入力フォームです。

入力フォームの例
入力フォームの例
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = "入力フォーム"
$form.Size = New-Object System.Drawing.Size(320, 180)
$form.StartPosition = "CenterScreen"

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10, 20)
$label.Size = New-Object System.Drawing.Size(280, 20)
$label.Text = "名前を入力してください:"
$form.Controls.Add($label)

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10, 45)
$textBox.Size = New-Object System.Drawing.Size(280, 20)
$form.Controls.Add($textBox)

$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75, 100)
$okButton.Size = New-Object System.Drawing.Size(75, 23)
$okButton.Text = "OK"
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)

$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(160, 100)
$cancelButton.Size = New-Object System.Drawing.Size(75, 23)
$cancelButton.Text = "キャンセル"
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)

$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
    Write-Host "入力された名前:$($textBox.Text)"
}

$form.AcceptButton に OK ボタンを設定することで、Enter キーでフォームを確定できます。 同様に $form.CancelButton に設定したボタンは Escape キーに対応します。

テーブル形式でのデータ表示

DataGridView コントロールを使うと、データをテーブル形式で表示できます。

テーブル表示の例
テーブル表示の例
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = "テーブル表示"
$form.Size = New-Object System.Drawing.Size(520, 380)
$form.StartPosition = "CenterScreen"

$dataGridView = New-Object System.Windows.Forms.DataGridView
$dataGridView.Location = New-Object System.Drawing.Point(10, 10)
$dataGridView.Size = New-Object System.Drawing.Size(480, 320)
$dataGridView.AutoSizeColumnsMode = "Fill"
$dataGridView.ReadOnly = $true
$dataGridView.SelectionMode = "FullRowSelect"
$dataGridView.AllowUserToAddRows = $false
$form.Controls.Add($dataGridView)

# DataTable を作成してデータを設定
$dataTable = New-Object System.Data.DataTable
$dataTable.Columns.Add("名前")  | Out-Null
$dataTable.Columns.Add("年齢")  | Out-Null
$dataTable.Columns.Add("部署")  | Out-Null

$dataTable.Rows.Add("田中 太郎", "30", "開発部") | Out-Null
$dataTable.Rows.Add("鈴木 花子", "25", "営業部") | Out-Null
$dataTable.Rows.Add("佐藤 次郎", "35", "総務部") | Out-Null

$dataGridView.DataSource = $dataTable

$form.ShowDialog() | Out-Null

DataGridView.DataSourceDataTable を渡すことで、列と行が自動的にバインドされます。 AutoSizeColumnsMode = "Fill" を設定すると、列幅がフォームの幅に合わせて自動調整されます。

CSV を Excel で直接編集させない

スクリプトのコンフィグファイルなどを CSV 形式で保存している場合、ユーザーが Excel で直接開いて編集することがあります。 Excel は CSV を開いて上書き保存すると、ファイル形式が変わってしまうため、スクリプト側で読み込む際にエラーになることがあります。

代わりに DataGridView でデータを表示・編集させることで、操作性も保ちつつファイル形式の問題も回避できます。 また、編集結果は PowerShell 上で扱えるオブジェクトとして取得できるため、後続の処理にもそのまま渡せます。

エクスプローラーでのファイル・フォルダ選択

フォルダ選択

FolderBrowserDialog を使うと、エクスプローラー形式でフォルダを選択できます。

Add-Type -AssemblyName System.Windows.Forms

$folderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
$folderDialog.Description = "フォルダを選択してください"
$folderDialog.ShowNewFolderButton = $true

if ($folderDialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
    Write-Host "選択されたフォルダ:$($folderDialog.SelectedPath)"
}

ファイル選択

OpenFileDialog を使うと、ファイルを選択できます。Multiselect$true にすると複数ファイルの選択も可能です。

Add-Type -AssemblyName System.Windows.Forms

$openFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$openFileDialog.Title = "ファイルを選択してください"
$openFileDialog.Filter = "テキストファイル (*.txt)|*.txt|すべてのファイル (*.*)|*.*"
$openFileDialog.Multiselect = $true

if ($openFileDialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
    foreach ($file in $openFileDialog.FileNames) {
        Write-Host "選択されたファイル:$file"
    }
}

まとめ

PowerShell の Windows Forms を使ったGUI作成の基本的な方法を紹介しました。

用途使用するクラス
入力フォームSystem.Windows.Forms.Form / TextBox / Button
テーブル表示System.Windows.Forms.DataGridView
フォルダ選択System.Windows.Forms.FolderBrowserDialog
ファイル選択System.Windows.Forms.OpenFileDialog

PowerShell でも簡単に GUI を作成できるので、ちょっとしたツールや設定画面を作る際に活用してみてください。

コメント

タイトルとURLをコピーしました