見出し画像

PowerShellだってC#に負けないGUIを作れる!

皆さんこんにちは!
株式会社ダイサン note担当者です。
PowerShell名人として名を轟かせた(い)筆者は、環境準備が不要で実行時にコンパイルやビルドが不要なPowerShellでGUIの開発を行っています。
(結局リリースするときは、exe化してしまうんですが…笑)

私は統合開発環境が苦手で、プログラムをガリガリ書くのが性に合っているため、書いている内に色々ノウハウが蓄積されていきました。
そこで今回はノウハウの一部をご紹介します。

完成例

今回はこんな感じのGUIを作ってみます。
いたって普通の画面ですね。

# .\main.ps1 : メインとなるファイル

. .\gui.ps1

function GUI_VIEW {
  . .\form1\form1-event.ps1
  . .\form1\form1-parts.ps1
}

# GUIの呼び出し
GUI_VIEW
# .\gui.ps1 : GUIパーツを生成する関数

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

function New-Parts {
  param (
    [String]$name,
    [HashTable]$event = $Null,
    [HashTable]$property = $Null
  )
  $form = New-Object $name
  foreach ($key in $property.Keys) {
    if ($property.$key -is [HashTable]) {
      foreach ($subkey in $property.$key.Keys) {
        $form.$key.$subkey = $property.$key.$subkey
      }
      continue
    }
    if ($key -eq 'Font') {
      $font = $property.$key
      if ($property.$key.Count -eq 3) {
        $font[2] = [System.Drawing.FontStyle]::($property.$key[2])
      }
      $form.$key = New-Object System.Drawing.Font($font)
    } else {
      $form.$key = $property.$key
    }
  }
  if ($event) {
    foreach ($key in $event.Keys) {
      $scriptblock = [ScriptBlock]::Create($event[$key])
      $form."Add_$key"($scriptblock)
    }
  }
  return $form
}
# .\form1\form1-event.ps1 : form1から呼び出される関数を定義するファイル

function TEST_FN {
  Get-Date | Write-Host
}
# .\form1\form1-parts.ps1 : パーツを定義するファイル

$form = New-Parts Form @{
  Text = "アプリタイトル"
  Width = 600
  Height = 600
  StartPosition = 'CenterScreen'  # 画面の中央に表示させる
  FormBorderStyle = 'FixedDialog' # ウィンドウサイズ変更不可にする
  MaximizeBox = $False            # 最大化ボタンを消す
}

$form.Controls.Add((New-Parts Label @{
  Text = "サンプルテキスト"
  Top = 10
  Left = 10
  AutoSize = $True
  TextAlign = 'MiddleCenter'
  BackColor = '#ffffff'
  Font = @('BIZ UDPゴシック',14,'Bold')
} -event @{Click = 'TEST_FN'}
))

[void]$form.ShowDialog()

C#程ではないものの、PowerShellでGUIを作るサンプルはネット上にそこそこありますが、どのサイトでもやはり
$form = System.Windows.Forms.Form
$form.Width = 600
$form.Height = 600
といった様に「$form」を列挙しないといけないため、書き方をなるべくシンプルにしたいと思い「New-Parts」という関数を定義。
「form1-parts.ps1」に書かないといけない量をかなり削減しました。

1つの画面にLabelやButton, TextBox, FlowLayoutPanel, DataGridView, etc…
いろんなパーツを配置していくときに、この一つの工夫がとても効いてきます!

これが出来上がるまでに、ChatGPTさんにもご助力頂きながら、便利な関数を作成することができました。
PowerShellを極めると場面によってはバッチよりプログラムが簡単に書く事ができたりとお得がいっぱいなので、是非みなさんもPowerShellを習得して、Powerプレイしましょう!!


この記事が気に入ったらサポートをしてみませんか?