【PowerShell】Windows PowerShell コマンドレットの作成 ~導入編~

■ コマンドレットの作成

環境設定

http://www.microsoft.com/ja-jp/download/details.aspx?id=30950
で、Windows SDKをダウンロードして、インストールする
注意
インストールする際には、拡張子を「.iso」(6.2.6000.0.18.WindowsSDK_Vista_JPN_daily.DVD.Rel.iso)にして
例えば「DAEMON Tools Lite(以下のURL参照)」などのISOをマウントするソフトを使って、インストールする
http://blogs.yahoo.co.jp/dk521123/16726927.html

準備

【1】VS上で、以下のDLLを参照設定する

追加するdll	                 | 参照先
---------------------------------+------------------------------------------------------------------------
System.Management.Automation.dll | C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0
System.Configuration.Install.dll | System.Configuration.Install.dll([参照の追加]-[.NET]タブで追加する)

【2】.NET Frameworkを「3.0」にする。手順は以下の通り。

■手順
1) ソリューションエクスプローラで、プロジェクト名を右クリックし、[プロパティ]を選択
2) [アプリケーション]タブで対象のフレームワークを「.NET Framework3.0」にする

ちなみに、以下を参考にした。【2】を行っていないと、下記の「System.BadImageFormatException」の例外が発生してしまう。
http://d.hatena.ne.jp/tmitu/20100909/1284033291

注意

http://msdn.microsoft.com/ja-jp/events/dd297528.aspx
によると、Windows PowerShell コマンドレット作成用のアドインがあって、ダウンロードすれば
使えるらしい。

プログラム作成

以下にサンプルプログラムを記す。

SampleShellSnapIn.cs

using System.ComponentModel;
using System.Management.Automation;

namespace SamplePowerShellCmdlet
{
    [RunInstaller(true)]
    public class SampleShellSnapIn : PSSnapIn
    {
        public override string Name
        {
            get
            {
                return "SampleShellSnapIn"; // ★注意★ここが、インストールの手順4)の「スナップイン名称」になる
            }
        }
        public override string Vendor
        {
            get
            {
                return "SampleCompany";
            }
        }
        public override string VendorResource
        {
            get
            {
                return "SampleShell, SampleCompany";
            }
        }
        public override string Description
        {
            get
            {
                return "Description";
            }
        }
        public override string DescriptionResource
        {
            get
            {
                return "DescriptionResource";
            }
        }
    }
}

GetProccess.cs

using System;
using System.Management.Automation;

namespace SamplePowerShellCmdlet
{
    [Cmdlet(VerbsCommon.Get, "GetProccess", SupportsShouldProcess = true)]
    public class GetProccess : PSCmdlet
    {
        #region Parameters
        /*
        [Parameter(Position = 0,
            Mandatory = false,
            ValueFromPipelineByPropertyName = true,
            HelpMessage = "Help Text")]
        [ValidateNotNullOrEmpty]
        public string Name
        {
        }
        */
        #endregion
        protected override void ProcessRecord()
        {
            try
            {
                this.WriteObject(
                    System.Diagnostics.Process.GetProcesses(), true);
            }
            catch (Exception)
            {
            }
        }
    }
}


インストール

 * 作成したクラスライブラリは、インストーラ ツール (Installutil.exe)を使って、インストールする

手順

1) 上記のプログラムをビルドして、DLLを作成する(今回は「SamplePowerShellCmdlet.dll」とする)

2) 「C:\Windows\System32\WindowsPowerShell\v1.0」にフォルダ(例えば「SnapIn」)を作成しておき、
  1)で作成したDLLを格納しておく

3) PowerShellを起動し、以下のようなコマンドを入力し、インストールする

&"$env:windir/Microsoft.NET/Framework/v2.0.50727/InstallUtil.exe" ($PSHome + "\SnapIn\SamplePowerShellCmdlet.dll");

 【別方法】(こっちの方がいい)
  3-1) [スタート]-[すべてのプログラム]-[Microsoft Windows SDK]-[CMDシェル]を選択
  3-2) DLLがあるところまで移動する(cd C:\Windows\System32\WindowsPowerShell\v1.0\SnapIn)
   3-3) 「installutil "対象のDLL名"」を入力する(今回の場合「installutil SamplePowerShellCmdlet.dll」)
 【参考:アンインストール】
  アンインストールは、「InstallUtil /u "アンインストールするファイルのパス"」を入力する

 詳細は、以下を参照のこと。
 http://codezine.jp/article/detail/3191?p=3
4) (必須の手順ではないが)インストールが成功したかどうかを確認するには、
  PowerShellコンソール上で「Get-PSSnapin -Registered」を入力する
 ⇒プログラム作成(上記の例だと「SampleShellSnapIn.cs」)時に入力したNameやDiscriptionなどが
   表示されているはず。

5) PowerShellコンソール上で「Add-PSSnapin "スナップイン名称"」を入力し、スナップインを登録する
 (上記の例だと「Add-PSSnapin SamplePowerShellCmdlet」)

実行

 * PowerShellコンソール上で、作成したコマンドレットを入力する
(上記の例だと「GetProcess」を入力する)