はじめに
普段の開発では 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.DataSource に DataTable を渡すことで、列と行が自動的にバインドされます。 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 を作成できるので、ちょっとしたツールや設定画面を作る際に活用してみてください。


コメント