都内で働くSEの技術的なひとりごと

都内でサラリーマンやってます。マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。よろしくお願いします♪

PowerShell を試してみる

 今回は PowerShell を色々試してみたいと思います。まずは、PowerShellスクリプトを編集・実行する環境である、PowerShell ISE の起動方法です。Windows8 だとスタートメニューからだと起動するのが面倒なので、デスクトップにピン留めするのがいいですね。( Windows Server 2012 だと、最初からデスクトップにピン留めしてあります。) 起動すると下記のような画面が表示されます。

f:id:koogucc11:20130525182503j:plain

 

左上がスクリプトエディタペイン、左下が PowerShell の実行ペイン、そして右側がコマンドレットを検索するペインです。コマンドレット検索ペインは便利ですね。分からないコマンドでも、なんとなくモジュール分類とキーワードで探せます。 また、このコマンドレットは .NETFramework を使って開発できます。WSH スクリプトや VBScript だとテキストエディタでの開発となるため、関数など知らないとスクリプト書けないですが、PowerShell ISE だと物覚えが悪い私のような技術者でも大丈夫です。(笑)

 初めて触って驚いたんですが、スクリプトエディタなのに、Visual Studio のようにインテリセンスが使えるんですね。例えば、(Get-lo と入力すると、下記のようにインテリセンスが働きます。

f:id:koogucc11:20130525183622p:plain

 

(Get-Location) を入力後に、ピリオドを入力すると Get-Location の戻り値に対して操作を行う関数・プロパティが表示されます。

f:id:koogucc11:20130525183927p:plain

 

 スクリプトエディタなのに、ここまでやってくれるとは。便利です。同じ操作を左上のエディタペインでも行うことが可能です。しかも、記述したスクリプトの実行もできるんですね。至れりつくせりですね。けど、ここまでできるのなら、Visual Studioとほとんど同じなんだし、統合したらと思ってしまいます。例えば、Visual Studio Express Edition で提供するとか考えなかったんでしょうか?

 

 機能はここまでで、早速 『コマンドレット』を Visual Studio 2012 を使用して作成したいと思います。手順は下記の通りです。

  1. Visual Studio でクラスライブラリプロジェクトを作成します。(ここでは、プロジェクト名を、【PowerShellCmdLetSample】 として進めたいと思います。)
  2. プロジェクトの参照設定で System.ManagementとSystem.Configuration.Install を参照設定します。
  3. System.Management ではなく System.Management.Automation を参照設定する必要があるのですが、ここでプロジェクトを保存し、 Visual Studio を終了させます。
  4. プロジェクトファイル (ここでは、PowerShellCmdLetSample.csproj ファイル)をテキストエディタで開きます。
  5. テキストで開くと、XML でプロジェクトの定義が記述されています。<ItemGroup> タグ配下に、<Reference Include="System.Management" /> というタグがありますので、そのタグの内容を <Reference Include="System.Management.Automation" /> と書き換えて、保存します。
  6. プロジェクトを再度開き、参照設定を確認すると System.Management.Automation が追加されていることが確認できます。

 

 これでコマンドレットのコードを記述する準備ができました。それでは、次に実際のコマンドレットのコーディング手順です。コマンドレットを開発するには、PSCmdletクラス、PSSnapInクラスを継承したクラスを作成する必要があります。PSCmdletクラスを継承したクラスのソースコードは下記の通りです。

 

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

    //CmdLetのコマンド名を指定する。この場合だと、Get_RyuchanName Get-RyuchanName となる。

    [Cmdlet("Get", "RyuchanName")]
    public class MySampleCommandLet : PSCmdlet
    {
        private string _myparameter = null;

        //コマンドレットで指定するパラメータ

        //Mandatory:パラメータを必須にする場合は、【true】を指定する。

        //Position:パラメータの位置。0から始まりまる。
        [Parameter(Mandatory = false,Position = 0)]
        public string MyParameter
        {
            get { return _myparameter; }
            set { _myparameter = value; }
        }

        //開始処理を記述する。
        protected override void BeginProcessing()
        {
            MyParameter = "hiragana";
        }

        //主処理を記述する。
        protected override void ProcessRecord()
        {
            if ("hiragana".Equals(MyParameter))
            {
                this.WriteObject("りゅうちゃん");
            }
            else
            {
                this.WriteObject("竜ちゃん");
            }
        }

        //終了処理する。
        protected override void EndProcessing()
        {
            //今回の処理では特に書くことありませんね。
        }
    }

 

 これで、CmdLet のコードでィングは終了です。次に、PowerShell のコマンドレットとしてインストールを行うには、PSSnapInクラスを継承したクラスを作成する必要があります。PSSnapInクラスを継承したクラスのソースコードは下記の通りです。

 

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

    //スナップインのプロパティなどを記載するクラス
    //インストールをする場合には、【true】

    [RunInstaller(true)]
    public class MySampleCommandLetSnapIn : PSSnapIn
    {   
        public MySampleCommandLetSnapIn()
            : base() { }

        //モジュール名など
        public override string Name
        {
            get { return "PowerShellCmdLetSample"; }
        }

        //会社名など
        public override string Vendor
        {
            get { return "ryuchan"; }
        }

        //コマンドレットの説明
        public override string Description
        {
            get { return "Cmdlet sample Program"; }
        }
    }

 PSSnapInのコーディングは終了です。コマンドレットのコーディングはこれで完了ですので、クラスライブラリをビルドします。次は、コマンドレットを使用するためにアセンブリのインストール作業および PowerShell へのスナップインを行います。手順は下記の通りです。

  1. installutil PowerShellCmdLetSample.dll を実行します。
  2. Power Shell ISEを起動します。
  3. PowerShell の実行ペインで、Add PSSnapin PowerShellCmdLetSample を実行します。( MySampleCommandLetSnapIn の Name プロパティに指定したものを引数に指定します。)
  4. スナップインが完了したら、Get-RyuchanName hiragana を実行します。(今回のサンプルは、MyParameter の Mandatory 属性が false なので、引数なしでも実行できます。)

f:id:koogucc11:20130526151851j:plain

 

 プログラム通りに実行されているのがわかります。PowerShell 面白いです。業務特有の監視プログラムなどをコマンドレット化し、運用監視用スクリプトなども簡単に書けそうです。次回はもうちょっと深い機能に挑戦してみよう。