PowerShellをインストールした時点で結構な数のコマンドが存在します。それをいろいろ組み合わせれば多くの作業が済んでしまうのですが、拡張またはPowerShellで全く提供されていない機能を持ち合わせたコマンドレットを自作することができます。今回はその基本をおさらいしましょう。
この間床に着く前ににIIS6の管理コマンドレットを作りたいと思ってメモしました。多分マイクロソフトからそういうコマンドレットは近い将来提供されるだろうと予想しながらも自作でがんばってこのブログの場で考えながら作っていきたいなあと思っているところです。
開発環境はWindowsXPとVS2008(C#)でやります。
さて、ではどうやったら自作(カスタム)コマンドレットを作ることができるのか。まずはWindowsのクラスライブラリのプロジェクトを作って参照を追加してしまいましょう。C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dllにあります、System.Management.Automationを追加しましょう。これがなくては始まりません。またIISを管理する核の部分は別のプロジェクト(IIS6Mgr)に書くことにします。というのはPowerShellだけでなくてそれにWindowsのGUIものせることも考えられるからです。すると下のような感じになります。
ここではすべて手作業でやっていきますが、PowerShell用のVisual StudioプロジェクトをダウンロードしてインストールしてやるとPowerShellカスタムコマンドのプロジェクトをプロジェクトの新規追加のダイアログボックスから選択できるようになります。なぜかChannel9からダウンロードが可能になっています。
まだIIS6を管理するコマンドを書いていませんが、とりあえず今回はカスタムコマンドレット書く方法を紹介したいのでそちらから先にやることにしましょう。
IISには複数のSiteが存在する可能性があるのでGet-IISSiteというコマンドレットを用意することにしましょう。PSIISのコマンドレットプロジェクトにGet-IISSiteというクラスを追加します。カスタムコマンドレットを作成するときは一つのコマンドレットにつき一つのクラスを用意することになります。それでは実際にGet-IISSiteのクラスを作成しコードを書くことにしましょう。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation;
namespace PSIIS
{
[Cmdlet(VerbsCommon.Get, "IISSite")]
public class Get_IISSite : Cmdlet
{
protected override void BeginProcessing()
{
WriteDebug("BeginProcessing");
}
protected override void ProcessRecord()
{
WriteDebug("ProcessRecord");
}
protected override void EndProcessing()
{
WriteDebug("EndProcessing");
}
}
}
上のコードを説明します。
まず初めにコマンドレットのクラスをCmdletクラスから継承します。classにはCmdletAttributeをつけます。 これで初めてPowerShellがこのクラスをコマンドレットと認識します。このCmdletAttributeにはVerbsCommonというstaticなクラスがありまして、よく使われる動詞がメンバーとして存在しています。別にVerbsCommonを使う必要はなく、自分の好きな動詞をstringとして使ってもかまいません。そしてその次に名詞をそのAttributeに渡してやります。これでGet-IISSiteというコマンドレットを宣言できたわけです。ちなみにこれが日本語でできるか現在興味ありな感じです。
後はoverrideできるメソッドを使ってそこにコードを書いてやります。今回はBeginProcessingとProcessRecordとEndProcessingにそれぞれWriteDebugメソッドを使って文字列をコンソールに書き出してみます。これをコンパイルしてインストールしてGet-IISSite -Debugとして実行してやると・・・
のように順番に実行されているのが分かります。BeginProcessingには初期化的なコードを書き、ProcessRecordにはメインのコードを書き、そしてEndProcessingには後始末のコードを書くのが適当だと言うことは想像できます。
今回はWriteDebugを使いました。WriteDebugの内容を表示するには-DebugのパラメータをコマンドレットにつけなければならないのとWriteDebugのコードが実行された直後に必ず「継続しますか?」と聞いてきますのでそれが面倒な場合には単にConsole.Write(Line)を使うとサクっとコンソールに文字列を表示してくれます。
基本編ではインストールの部分を端折りました。近日中にそれについてブログしようと思います。

最近のコメント