週末のプロジェクトの時間です。今日は、最も必要なPowerShellスクリプトを簡単に起動できる軽量なシステムトレイのPowerShellフォームメニューの作り方を学びます。下記に最終結果をご覧いただけます。

この記事では、プロセスを段階的に分解して、独自のPowerShellメニューGUIを作成する方法を学びます。
環境と知識の要件
取り組む前に、以下の最低要件を満たしていることを確認してください:
- Windows 7以降
- Windows PowerShell 3以降 – .NET Core 3.0の最新バージョンとPowerShell 7プレビューは、WPFとWinFormのサポートが追加されたため、Windowsで動作する可能性がありますが、テストはされていません。
- .NET Framework 4.5以降
- A familiarity with Windows Forms (WinForms) You can, however, due this with WPF too though.
このプロジェクトでは、主に以下のコンポーネントに依存するため、Visual StudioやPoshGUIなどのUI開発ツールに頼る必要はありません:
- NotifyIcon – ユーザーが操作できるカスタマイズ可能なシステムトレイアイコンです。
- コンテキストメニュー – ユーザーがトレイアイコンを右クリックしたときのコンテナ。
- メニューアイテム – 右クリックメニュー内の各オプションの個別のオブジェクト。
お気に入りのPowerShellスクリプトエディタを開いて、始めましょう!
このプロジェクトでは、3つの関数を作成します。コンソールを表示/非表示にするための2つの関数と、システムトレイメニューにアイテムを追加するための1つの関数です。これらの関数は、後でより簡単になるための基盤として機能し、この記事の後半で少し詳しく学ぶことができます。
コンソールウィンドウの表示/非表示
PowerShellスクリプトを起動すると、おなじみのPowerShellコンソールが起動します。作成するPowerShellフォームのメニューアイテムはスクリプトを起動するため、コンソールが起動しないようにする必要があります。単に実行するだけです。
スクリプトが実行されると、少しの.NETを使用してPowerShellコンソールウィンドウを表示するかどうかを切り替えることができます。
現在のセッションにWindow .NETタイプを追加します。これを行うには、以下に示すようにC#を使用します。現在のPowerShellスクリプトのコンテキストにロードする必要がある2つのメソッドはGetConsoleWindowとShowWindowです。これらのDLLをメモリに読み込むことで、APIの一部を公開し、PowerShellスクリプトのコンテキストで使用できるようにします。
次に、次のようにGetConsoleWindow()
およびShowWindow()
メソッドを使用して、上記で読み込んだDLLを使用する2つの関数を作成します。
これらの2つの関数を使用することで、コンソールウィンドウを表示または非表示にする方法を作成しました。
注意:メニューを介して実行されるスクリプトの出力を表示したい場合は、PowerShellトランスクリプトまたは他のテキストベースのログ機能を使用することができます。これにより、WindowStyleパラメータを使用してPowerShellセッションを実行するだけではなく、制御を保持することができます。
次に、Start-HideConsole
を呼び出してスクリプトコードの構築を開始します。PowerShellフォームのメニュードリブンスクリプトが実行されると、PowerShellコンソールウィンドウが表示されないようになります。
メニューオプションの作成
では、メニューオプションの作成時に新しいオプションを簡単に作成できるように、New-MenuItem
という別の関数を作成します。この関数を呼び出すと、MenuItem .NETオブジェクトが作成され、後でメニューに追加できます。
各メニューオプションは別のスクリプトを起動するか、ランチャーを終了するため、New-MenuItem
関数には3つのパラメータがあります:
Text
– ユーザーがクリックするラベルMyScriptPath
– 実行するPowerShellスクリプトのパスExitOnly
– ランチャーを終了するオプション
以下の関数スニペットをメニュースクリプトに追加してください。
New-MenuItem
関数の作成を続けるために、MenuItemオブジェクトを変数に割り当てます。
次に、メニューアイテムにテキストラベルを割り当てます。
そして、MenuItemにMyScriptPath
というカスタムプロパティを追加します。このパスは、メニューでアイテムがクリックされたときに呼び出されます。
MenuItemにクリックイベントを追加し、所望のスクリプトを起動します。Start-Processは、PowerShellが利用できない場合や提供されたパスにスクリプトが存在しない場合など、スクリプトの起動時に発生するエラーをcatchブロックに受けるためのクリーンな方法を提供します。try/catchブロック内でこれを行ってください。
ランチャーに終了条件を提供し、新しく作成したMenuItemを実行時に別の変数に割り当てるための残りのロジックを追加してください。
これで、New-MenuItem
関数が作成されました!最終的な関数は次のようになります:
New-MenuItem
関数をテストするには、上記のコードをPowerShellコンソールにコピーして貼り付け、偽のパラメータ値を指定して関数を実行します。.NETのMenuItemオブジェクトが返されることがわかります。
ランチャーフォームの作成
このようなさらなるヒントをお求めですか?私の個人的なPowerShellブログをチェックしてください:https://nkasco.com/FriendsOfATA
新しいメニューアイテムを簡単に作成できるようになったので、メニューを表示するシステムトレイのランチャーを作成しましょう。
コンポーネントを追加するための基本的なフォームオブジェクトを作成します。これはユーザーに表示されるものではないため、フォームは背後でコンソールを実行し続けます。
次に、システムトレイに表示されるアイコンを作成します。以下では、PowerShellのアイコンを使用することにしました。実行時に、以下のコードが実際のシステムトレイアイコンを作成します。このアイコンは、SystrayIcon
変数を設定することで、好みに応じてカスタマイズすることができます。
他の方法でアイコンをメモリに読み込むことができるSystem.Drawing.Iconクラスのドキュメントをご覧ください。
スクリプトを実行すると、以下のようにPowerShellのアイコンがシステムトレイに表示されるはずです。
次に、新しいContextMenuオブジェクトを使用してメニューアイテムのコンテナを作成し、すべてのメニューアイテムを作成します。この例では、メニューには2つのスクリプトを実行するオプションと終了オプションがあります。
次に、作成したすべてのメニューアイテムをコンテキストメニューに追加します。これにより、各メニューオプションがフォームのコンテキストメニューに表示されるようになります。
ランチャーフォームを表示する
フォームが完成したので、最後に行うことは、PowerShellのコンソールウィンドウが表示されないようにフォームを表示することです。これを行うには、Start-HideConsole
を使用してコンソールを非表示にし、ランチャーフォームを表示し、Start-ShowConsole
を使用してコンソールを再表示し、ハングアップしたpowershell.exeプロセスを防ぎます。
このようなもっと多くのヒントをお求めですか? 私の個人のPowerShellブログをチェックしてください: https://nkasco.com/FriendsOfATA
完全なコードはこちらで入手できます: https://github.com/nkasco/PSSystrayLauncher
学びどころ
おめでとうございます、このプロジェクトを完了しました! この記事で学んだこと:
- Windows APIのコンポーネントを公開する方法。
- WinFormsを介してコンテキストメニューを操作し、続くメニューアイテムを追加する方法。
- PowerShellでシステムトレイアイコンを作成する方法。
このプロジェクトにより、PowerShellスクリプトのための独自のシステレイメニューを作成するための理解と経験が得られるはずです!