PowerShell を試してみる
今回は PowerShell を色々試してみたいと思います。まずは、PowerShellスクリプトを編集・実行する環境である、PowerShell ISE の起動方法です。Windows8 だとスタートメニューからだと起動するのが面倒なので、デスクトップにピン留めするのがいいですね。( Windows Server 2012 だと、最初からデスクトップにピン留めしてあります。) 起動すると下記のような画面が表示されます。
左上がスクリプトエディタペイン、左下が PowerShell の実行ペイン、そして右側がコマンドレットを検索するペインです。コマンドレット検索ペインは便利ですね。分からないコマンドでも、なんとなくモジュール分類とキーワードで探せます。 また、このコマンドレットは .NETFramework を使って開発できます。WSH スクリプトや VBScript だとテキストエディタでの開発となるため、関数など知らないとスクリプト書けないですが、PowerShell ISE だと物覚えが悪い私のような技術者でも大丈夫です。(笑)
初めて触って驚いたんですが、スクリプトエディタなのに、Visual Studio のようにインテリセンスが使えるんですね。例えば、(Get-lo と入力すると、下記のようにインテリセンスが働きます。
(Get-Location) を入力後に、ピリオドを入力すると Get-Location の戻り値に対して操作を行う関数・プロパティが表示されます。
スクリプトエディタなのに、ここまでやってくれるとは。便利です。同じ操作を左上のエディタペインでも行うことが可能です。しかも、記述したスクリプトの実行もできるんですね。至れりつくせりですね。けど、ここまでできるのなら、Visual Studioとほとんど同じなんだし、統合したらと思ってしまいます。例えば、Visual Studio Express Edition で提供するとか考えなかったんでしょうか?
機能はここまでで、早速 『コマンドレット』を Visual Studio 2012 を使用して作成したいと思います。手順は下記の通りです。
- Visual Studio でクラスライブラリプロジェクトを作成します。(ここでは、プロジェクト名を、【PowerShellCmdLetSample】 として進めたいと思います。)
- プロジェクトの参照設定で System.ManagementとSystem.Configuration.Install を参照設定します。
- System.Management ではなく System.Management.Automation を参照設定する必要があるのですが、ここでプロジェクトを保存し、 Visual Studio を終了させます。
- プロジェクトファイル (ここでは、PowerShellCmdLetSample.csproj ファイル)をテキストエディタで開きます。
- テキストで開くと、XML でプロジェクトの定義が記述されています。<ItemGroup> タグ配下に、<Reference Include="System.Management" /> というタグがありますので、そのタグの内容を <Reference Include="System.Management.Automation" /> と書き換えて、保存します。
- プロジェクトを再度開き、参照設定を確認すると 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 へのスナップインを行います。手順は下記の通りです。
- installutil PowerShellCmdLetSample.dll を実行します。
- Power Shell ISEを起動します。
- PowerShell の実行ペインで、Add PSSnapin PowerShellCmdLetSample を実行します。( MySampleCommandLetSnapIn の Name プロパティに指定したものを引数に指定します。)
- スナップインが完了したら、Get-RyuchanName hiragana を実行します。(今回のサンプルは、MyParameter の Mandatory 属性が false なので、引数なしでも実行できます。)
プログラム通りに実行されているのがわかります。PowerShell 面白いです。業務特有の監視プログラムなどをコマンドレット化し、運用監視用スクリプトなども簡単に書けそうです。次回はもうちょっと深い機能に挑戦してみよう。