コマンドレットクラスの作成
独自のコマンドレットを作成するには、コマンドレットクラスを作成する必要があります。
サンプルとして、イベントログへ書き込みを行う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
コマンドレットの実装は完了です。一度ビルドをしてエラーがないことを確認してください。