LoginSignup
8
14

More than 3 years have passed since last update.

PowershellのユーザーフォームをVisualStudioで手軽に作成する

Last updated at Posted at 2020-04-22

使ったもの、バージョン等
powershell 5.1
powershell ISE
Visual Studio 2017

概要

PowerShellのGUIをサイズなど手探りで作成するのが手間だったので、Visual Studio のVB用のWindowsフォームを利用して作成して、それをPowerShellの文法に直して(といってもほぼ文字置換のみですが)流用するという邪道的な方法です。
どちらも.GUIはNETFrameworkを使用するので文法はあまり変わらないんじゃないかと思ってやってみたら、本当に簡単にできました。
 私はVBは全く知りません。PowerShellも大してできるわけじゃないんですが。
 そんな人でもPowerShell用のGUIが簡単に作れますよというメモです。
 なぜVBで作ったものをわざわざPowerShellに書き換えるかというと、もうそれは会社のPCがインストール禁止,自作exe禁止だからという点に尽きます。
2020-04-22.png2020-04-22 (1).png
 まずはVisualStudioで新規作成→プロジェクト→
左でVisualBasicを選択→Windowsフォームアプリケーション(.NET Framework)→OK

2020-04-22 (2).png

ツールボックスが表示されていなかったら、表示→ツールボックスで表示されます。
2020-04-22 (3).png

各ツールを配置します。配置や修正の方法はVBAとほとんど同じですので割愛します。
2020-04-22 (4).png
できました。
タブの「Form1.vb(デザイン)」タブから「Form1Designer.vb」タブに移動します。
2020-04-22 (5).png
このコードを上から下まで全コピーしてPowerShell ISEに連れてきます(下で削除している先頭部分、末尾部分を除いてコピーでもOK)。

先頭の
_から Private Sub InitializeComponent()まで削除します
2020-04-22 (6).png

末尾の
End Sub からEnd Clas までのfriendまわりも削除します
2020-04-22 (7).png

置換作業

PowerShell ISEの編集→スクリプト内で置換

2020-04-22 (8).png
コメントアウトの「'」をPowerShell用に「#」に全置換
Single指定の「!」も「」に置換して消す
「True」を「$True」
「False」を「$False」に全置換(注:$は半角)
インスタンス生成の「New」を「New-Object」に置換
インスタンス生成時のコンストラクタの「()」を「」に置換して消します。消すのは最初のインスタンス生成の部分だけで、Me.SuspendLayout()以降は消してはいけません。
 引数なしメソッドの()は消さないように。繰り返しになりますが、特にインスタンス生成直後のMe.SuspendLayout()の()からは消さないでください。
2020-04-22 (9).png

最後に「Me.」を「$」に置換するのですが、Form Classを削除している関係で、インスタンス生成直後のMe.SuspendLayout()と最後の#Form1ブロックの左辺はフォームの変数(今回は$form)にする必要があります。
 先に#Form1ブロックの左辺を「Me.」から「$form.」に置換して、残りすべてを「Me.」を「$」に置換します。
 これで置換作業は終了です。
2020-04-22 (13).png
先に#Form1ブロックの左辺を「Me.」から「$form.」に置換
その後「Me.」を「$」に全置換するのがよいと思います。
だいぶそれらしくなってきました。

アセンブリのロード

使用されているアセンブリを確認して、今回は
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.drawing
の2つをロードします。
また、Form Classを削除しているので、先ほど置き換えた変数名でフォームを定義します。
$form = New-Object System.Windows.Form2020-04-22 (14).png

static関係を修正,仕上げ

2020-04-22 (17).png

 System.Windows.Forms.AutoScaleMode.Font

 [System.Windows.Forms.AutoScaleMode]::Font

2020-04-22 (18).png

System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(128, Byte)

[System.Drawing.FontStyle]::Regular,[ System.Drawing.GraphicsUnit]::Point,128

CTypeは型変換で型をバイトにしていますが、128の数値自体は変わりません。

そしていよいよ末尾に $result = $form.ShowDialog()を追加すると
image.png
表示されました。

 そして、キーボードでユーザーフォームを操作しやすくするために、タブクリックで指定される順序「TabIndex」の値を操作します。そのままだとユーザーフォームで作った順番で、しかもラベルが含まれてしまいます。最初がTabIndex = 0となり、1からではないのでご注意ください。
 これで、とりあえずフォームは完成です。

 もちろん、ここから各ボタンのイベント登録、記載の重複等の整理が要りますが、とりあえずフォームを手探りで作らなくていいので、便利だと思います。

 5/15追記 ()の置換部分とCTypeの変換部分

8
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
14