SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Power Shellを拡張するコマンドレットの作成

Windows PowerShell 独自コマンドレットの開発

スナップインの開発とPowerShellへの登録

  • X ポスト
  • このエントリーをはてなブックマークに追加

コマンドレットクラスの作成

 独自のコマンドレットを作成するには、コマンドレットクラスを作成する必要があります。

 サンプルとして、イベントログへ書き込みを行う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はそれぞれ必須のパラメータとするので、MandatoryTrueをセットしています。また、パラメータの順番は、SourceNameMessageの順にするのでPositionを指定しています。

 ここまででAdd-EventEntryコマンドレットの実装は完了です。一度ビルドをしてエラーがないことを確認してください。

次のページ
スナップインクラスの作成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Power Shellを拡張するコマンドレットの作成連載記事一覧
この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3191 2008/11/13 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング