コマンドレットクラスの作成
独自のコマンドレットを作成するには、コマンドレットクラスを作成する必要があります。
サンプルとして、イベントログへ書き込みを行うAdd-EventEntryというコマンドレットを作成します。
Add-EventEntryコマンドレットには「SourceName:イベントソースを指定する」「Message:書き込むメッセージ」という2つのパラメータも実装します。
プロジェクトにクラスを新規追加し、ファイル名を「AddEventEntry.vb」とします。

最初に名前空間System.Management.Automation(コマンドレット用)とSystem.Diagnostics(イベントログ操作用)をインポートします。
Imports System.Management.Automation Imports System.Diagnostics

Cmdlet属性の追加
作成したクラスをコマンドレットと認識させるために、Cmdlet属性を追加する必要があります(MSDN Library 『CmdletAttribute Declareration』参照)。
Cmdlet属性は
<Cmdlet("verbName", "nounName")>
のように記述し、今回作成するAdd-EventEntryの場合は
<Cmdlet(VerbsCommon.Add, "EventEntry")> _
と記述します。
「verbName」および「nounName」はString型で、「verbName」には動詞を表す文字列を、「nounName」の部分名詞を表す文字列を指定します。これはコマンドレットが「動詞-名詞」の命名規則を持っており、それに倣うためです。また「verbName」には、あらかじめ定義されている列挙体を使用することが推奨されています。
使用可能な列挙体には下記のものがあります(リンク先は英語)。
| 使用可能な列挙体 | 説明 |
| VerbsCommon | 共通動詞 |
| VerbsCommunications | コミュニケーション関連 |
| VerbsData | データ操作関連 |
| VerbsDiagnostic | 診断関連 |
| VerbsLifeCycle | ライフサイクル関連 |
| VerbsSecurity | セキュリティ関連 |
Cmdletクラスの継承
作成するAddEventEntryクラスは、クラスCmdletを継承する必要があります。
ここまでのAddEventEntry.vbのコードは下記の通りです。
Imports System.Management.Automation Imports System.Diagnostics <Cmdlet(VerbsCommon.Add, "EventEntry")> _ Public Class AddEventEntry Inherits Cmdlet End Class
コマンドレットを実装する
コマンドレット本体を実装するには、いくつかの仮想メソッドをオーバーライドします。
主要な仮想メソッドは下記の通りです。
| 仮想メソッド | 説明 |
| BeginProcessメソッド | 事前処理を行うためのメソッドです。パイプラインで配列オブジェクトを受け取った場合でも、このメソッドは最初の一度しか呼ばれません。 |
| ProcessRecordメソッド | このメソッドがコマンドレットの本体となります。 |
| EndProcessingメソッド | 事後処理を行うためのメソッドです。パイプラインで配列オブジェクトを受け取った場合でも、このメソッドは最後にの一度しか呼ばれません。 |
| StopProcessingメソッド | コマンドレット実行中に[Ctrl]+[C]が押された場合は、このメソッドが呼ばれます。 |
上記に示した仮想メソッドのうち、最低でもProcessRecordメソッドがあればコマンドレットを作成することができます。
本体の実装
今回はパイプラインを意識しないので、ProcessRecordメソッドだけをオーバーライドします。コードは下記の通りです。
Protected Overrides Sub ProcessRecord() Dim entryType As EventLogEntryType entryType = EventLogEntryType.Information 'ソースが存在しているか? If Not EventLog.SourceExists(_sourceName) Then 'ソースが存在していないので作成する System.Diagnostics.EventLog.CreateEventSource(_sourceName, "") End If 'イベントログにエントリを書き込む EventLog.WriteEntry(_sourceName, _message, entryType) WriteObject("イベントを書き込みました") End Sub
イベントの書き込みはSystem.Diagnostics名前空間にあるEventLogクラスで行います。
はじめにイベントソースがあるかどうかをIf文でチェックし、存在しなかった場合にはCreateEventSourceメソッドで作成します。次にイベントエントリの書き込みですがWriteEntryメソッドを使用しました。このとき、イベントのタイプ(EventLogEntryType)を指定するのですが、今回は固定値としてInformationとしています。
変数_sourcenameおよび_messageには後述するパラメータでセットされる値が格納されます。
メソッドの最後の行で使用しているWriteObjectメソッドを使用すると、PowerShellコンソール上にメッセージを出力することができます。
パラメータの実装
今回作成するAdd-EventEntryコマンドレットの2つのパラメータを実装します。パラメータはコマンドレットクラスのプロパティとして実装し、Parameter属性を付加することで作成することができます。
属性にはいくつかの名前付き引数があります。主な属性は下記の通りです
| 属性 | 説明 |
| Mandatory | この属性はBool値で表し、必須のパラメータにする場合はTrueを指定します。 |
| Position | PowerShellでは、パラメータ名を省略してコマンドレットを実行することが可能です。パラメータ名を省略した場合には、この番号によってパラメータと値とが紐付けされます。 |
コマンドレットのパラメータですが、Parameter属性を付けたプロパティのプロパティ名称と型が、それぞれパラメータの名称と型となります。
このことを踏まえて作成したプロパティは下記の通りです。
Private string _sourcename; Private string _message; <Parameter(Mandatory:=True, Position:=0)> _ Public Property SourceName() As String Get Return _sourceName End Get Set(ByVal value As String) _sourceName = value End Set End Property <Parameter(Mandatory:=True, Position:=1)> _ Public Property Message() As String Get Return _message End Get Set(ByVal value As String) _message = value End Set End Property
パラメータSourceNameおよびMessageはそれぞれ必須のパラメータとするので、MandatoryにTrueをセットしています。また、パラメータの順番は、SourceName、Messageの順にするのでPositionを指定しています。
ここまででAdd-EventEntryコマンドレットの実装は完了です。一度ビルドをしてエラーがないことを確認してください。
