Windows PowerShell Visual Studio 2005 Templatesの導入 - インストール編 - Windows PowerShell Visual Studio 2005 Templatesの導入 - コマンドレットの開発(1) - の続きです。
今回は、実際にVisual Studio 2005を使用したPowerShellのコマンドレットの開発方法について説明したいと思います。
まずは前回作成したSampleCmdletプロジェクトを開き、新しい項目の追加を行います。
テンプレート欄の「マイテンプレート」に Winodws PowerShell Cmdlet と Windows PowerShell PSCmdlet の2つの項目があることがわかります。
・Windows PowerShell CmdletはVB.NETやC#から直接呼び出せるコマンドレットの作成
・Windows PowerShell PSCmdlet はPowerShellに組み込まれたコマンドレットの作成
を行うことができます。
今回は、IPHostEntryクラスを使用して、ホスト名からIPアドレスを取得するコマンドレットGet-IPFromHostを作成してみようと思います。
1.マイテンプレートから「Windows PowerShell PSCmdlet」を選択
2.ファイル名を入力
(ファイル名には作成するコマンドレットの名詞部分を使用することをおすすめします。
今回はコマンドレット名がGet-IPFromHostなので"IPFromHost"をファイル名にします。
あとで説明しますが、このファイル名が作成されるファイルのパラメータ部分に自動セットされます)
3.[追加]ボタンを押す
作成されたファイルIPromHost.csは下記のようになります。
コマンドレットの属性について
public class IPFromHost : PSCmdlet の1行上にあるの "[" から "]" までが、コマンドレットの属性となります。
VerbsCommon列挙体がコマンドレット名の動詞部分になります。作成する Get-IPFromHost コマンドレットは動詞部分が Get なので、ここではVerbsCommon.Getを選択します。
また名詞部分はIPFromHostなので、第2引数は"IPFromHost"を指定します。
これらの設定により、コマンドレット名がGet-IPHostEntryとなります。
属性の SupportShouldProcess ですが、True に設定するとシステムを変更する操作が実行される前にユーザーに確認を求めることができます。
これは-whatIf, -confirmパラメータをサポートすることを意味します。
SupportShouldProcess がFalse (既定値) に設定されている場合は、コマンドレットが ShouldProcess メソッドの呼び出しをサポートしないことを示します。
コマンドレットパラメータについて
コマンドレットのパラメータを作成する場合は、クラスにプロパティを追加する必要があります。
先ほど選択したテンプレート「Windows PowerShell PSCmdlet」はコマンドレットパラメータが自動で挿入されるようになっています。
#region Parametersから#endregion までがコマンドレットパラメータ記述用プロパティとなります。
ただしこの部分はコメントアウトされているので、コマンドレットにパラメータを持たせる場合には、この部分のコメントを外して作成します。
コマンドレット本体について
コマンドレット本体は protected override void ProcessRecordに記述します。
この中でWriteObjectメソッドを使用するとPowerShellのコマンドプロンプトにメッセージを出力することができます。
Get-IPFromHostの仕様
まず仕様について説明します。
Get-IPFromHost "ホスト名"
と入力すると、入力したホスト名からIPアドレスを取得して表示する というコマンドレットを作成したいと思います。
Get-IPFromHostのパラメータの作成
先ほど、パラメータはクラスのプロパティとして作成することを説明しました。
今回、パラメータ名はHostnameとしたいと思います。
#region Parameters ~#endregionまでのコメントを外して下記のように入力してください。
#region Parameters
private string _hostname = string.Empty;
[Parameter(Position = 0,
Mandatory = true,
ValueFromPipelineByPropertyName = true,
HelpMessage = "ホスト名を指定します")]
[ValidateNotNullOrEmpty]
public string Hostname
{
set { _hostname = value; }
}
#endregion
上述のコードですが、クラスのプロパティ名 = コマンドレットのパラメータ名になるので、プロパティ名をHostnameにします。
また、コマンドラインから受け取った値はvalue変数にセットされます。
今回はホスト名がvalue変数にセットされるので、プライベート変数 _hostnameにセットし、ProcessRecordメソッドで使用できるようにしておきます。
パラメータ属性について
属性のMandatoryですが、これはパラメータの省略可否を示します。省略できないパラメータにはtrueをセットします。
今回は、ホスト名からIPアドレスを取得するので、パラメータHostnameは省略できないパラメータとなりますので、Mandatory = true とします。
このようにすると、パラメータを省略してコマンドレットを実行した場合は、パラメータを指定するよう指示が表示されます。
またHelpMessage属性にはパラメータの説明を記述しておきます。
!? でパラメータのヘルプを表示することができるようになります。
Get-IPFromHost本体の作成
いよいよ本体のコーディングです。
ホスト名からIPアドレスを取得するにはSystem.Net.IPHostEntryクラスを使用します。
今回はコマンドレットの作成が主なので、この辺の説明は割愛させて頂きます。
コマンドレット本体のコードはProcessRecord()に記述します。
コードの説明ですが
パラメータとして受け取った値(_hostname)を使用してipentryを作成し、IPアドレスを取得します。
取得したIPアドレスはWriteObjectメソッドを使用して、コマンドラインに出力しています。
下記が本体のコードです。
protected override void ProcessRecord()
{
try
{
System.Net.IPHostEntry ipentry = System.Net.Dns.GetHostEntry(_hostname);
System.Net.IPAddress hostadd = ipentry.AddressList[0];
WriteObject(hostadd.ToString());
throw new NotImplementedException();
}
catch (Exception)
{
}
}
次回は作成したコマンドレットのインストールについて説明したいと思います。