今回はカスタムコマンドレットのインストール方法について書くことにします。(現在カリフォルニアに向かう途中の飛行機の中。)
簡潔に言うとInstallerクラスをカスタムコマンドレットのプロジェクトに追加し、InstallUtilでアセンブリ(DLL)をインストールしてからAdd-PSSnapinを実行すると初めてカスタムコマンドレットが使えるようになります。
まずはInstallerクラスをカスタムコマンドレットのプロジェクトに追加します。
追加したらそのコードを開いてクラスをSystem.Management.Automation.PSSnapInというクラスから継承します。
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Management.Automation;
namespace PSIIS
{
[RunInstaller(true)]
public partial class PSSnapinInstaller : PSSnapIn
{
public PSSnapinInstaller()
{
InitializeComponent();
}
public override string Name
{
get { return "PSIIS"; }
}
public override string Vendor
{
get { return "www.devslife.com"; }
}
public override string VendorResource
{
get { return "PSIIS6,"; }
}
public override string Description
{
get { return "PowerShell Cmdlets to Manage IIS6"; }
}
public override string DescriptionResource
{
get { return "PowerShell Cmdlets to Manage IIS6"; }
}
}
}
個人的な目的で使うならこれらのプロパティはあまり重要ではありませんが、後で見て分かりやすい情報を入れておくといいでしょう。上のInstallerクラスの準備ができたらコンパイルしましょう。
次にInstallUtilを使ってカスタムコマンドレットのAssembly(DLL)をインストールします。Visual Studio 2008 Command Prompt(またはVisual Studio 2005 Command Prompt)を立ち上げてアセンブリが存在するディレクトリに移動してInstalUtil PSIIS.dllと入力して実行します。
ここでPowerShellに戻ってGet-PSSnapin -Registeredと入力するとそのアセンブリがPowerShellによって認識されたことが分かります。しかし認識されてはいるのですが、まだ使える状態にはなっていません。最後にAdd-PSSnapin PSIISと入力して実行すると初めて自作コマンドレットが使えるようになります。
PowerShellコンソールを一度閉じてしまうと自作コマンドは再びAdd-PSSnapinを実行してやらないと使えるようになりません。どうしてAdd-PSSnapinを実行した時点でPowerShellに登録されないのかは定かではないです。それが面倒な場合は$profileにあるMicrosoft.PowerShell_profile.ps1(ない場合は作りましょう。set-executionpolicy unrestrictedを忘れないように。)にAdd-PSSnapin PSIISというコマンドを入れて保存してやると自作コマンドレットがPowerShell起動後すぐに使えるようになります。

Visual Studioを利用してカスタムコマンドレットを作成する連載の開始ですね。
スクリプトや関数の作成方法を解説しているサイトは多いのですが、カスタムコマンドレットに関する詳細な説明をしているサイトが少ないのが現状です。
入海さんの記事楽しみにしています。
HIROさん、コメントありがとうございます。
記事を書くのはコミュニティに貢献するという意味もありますが、
頭の中にあるものを整理したり曖昧なところをリサーチするという
役割もあります。一石二鳥ですね。HIROさんのブログも興味深く
読ませていただいております。お互いがんばりましょう。