読者です 読者をやめる 読者になる 読者になる

PowerShellを試してみた

自作のクラスライブラリに対して、ちょっとした処理を実行したいときに、スクリプト言語があれば便利だなと思ったので、前々から気になっていたPowerShellを試してみました。

PowerShellは、管理者向けのスクリプト環境だと思っていたのですが、.NETフレームワークのライブラリも呼び出せるし、なかなか使えそうな感じです。
という訳で早速、本を買ってきました。

プログラマブルPowerShell ~プログラマのための活用バイブル~ (.NET TECHNOLOGYシリーズ)

プログラマブルPowerShell ~プログラマのための活用バイブル~ (.NET TECHNOLOGYシリーズ)

この本は結構細かい仕様なども記述されていましたが、ざっとPowerShellの概要を理解できました。
PowerShellは、なかなか面白い特徴を持っていますね。

  • PSプロバイダというデータを抽象化する仕組みにより、ファイル、関数、レジストリを同じインタフェースで扱える。
  • Perlのようなパイプラインやフィルタが使える。
  • コマンドの戻り値がオブジェクトである。
  • コマンドレットの命名規約が [動詞]-[名詞] と一貫されている。


さて、PowerShellから自作の.NETライブラリを利用するためには、以下のようなコマンドを実行する必要があるようです。

PS > [void][Reflection.Assembly]::LoadFrom($(pwd).path + '\..\..\bin\Release\hoge.dll')
PS > [void][Reflection.Assembly]::LoadFrom($(pwd).path + '\..\..\bin\Release\fuga.dll')
PS > [void][Reflection.Assembly]::LoadFrom($(pwd).path + '\..\..\bin\Release\foo.dll')
PS > [void][Reflection.Assembly]::LoadFrom($(pwd).path + '\..\..\bin\Release\bar.dll')

しかし、これだとDLLのパスを毎回指定する必要があり、使い勝手が悪いですね。


ということで、GacUtil.exeを使って、対象となるDLLをグローバルアセンブリキャッシュに登録します。

Visual Studio 2005のビルドイベントに、以下のように書いておきます。

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i $(OutDir)hoge.dll
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i $(OutDir)fuga.dll
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i $(OutDir)foo.dll"
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i $(OutDir)bar.dll


すると、PowerShellからは、以下のようにしてDLLをロードすることができます。

PS > [void][Reflection.Assembly]::LoadWithPartialName("hoge")
PS > [void][Reflection.Assembly]::LoadWithPartialName("fuga")
PS > [void][Reflection.Assembly]::LoadWithPartialName("foo")
PS > [void][Reflection.Assembly]::LoadWithPartialName("bar")

これでパスを指定しなくてもよくなったのですが、これでも毎回入力するのは面倒です。

できれば関数かコマンドレット1つでロードしたいところです。


関数であればprofile.ps1にFunctionを追加すればよいみたいですが、今回は複数の人に配布する可能性もあるので、コマンドレットを作成してみました。

まずプロジェクトを作成し、参照に「System.Management.Automation」と「System.Configuration.Install」を追加します。
次にプロジェクトに2つのファイルを追加します。

using System;
using System.Management.Automation;

namespace HogeUtil
{
    [Cmdlet("Import","HogeLibrary")]
    public class ImportHogeLibrary : Cmdlet
    {
        protected override void ProcessRecord()
        {
            System.Reflection.Assembly.LoadWithPartialName("hoge");
            System.Reflection.Assembly.LoadWithPartialName("fuga");
            System.Reflection.Assembly.LoadWithPartialName("foo");
            System.Reflection.Assembly.LoadWithPartialName("bar");
        }
    }
}
using System;
using System.Management.Automation;
using System.ComponentModel;

namespace HogeUtil
{
    [RunInstaller(true)]
    public class HogeUtilSnapIn : PSSnapIn
    {
        public override string Description
        {
            get { return "Hoge Utility"; }
        }

        public override string Name
        {
            get { return "HogeUtil"; }
        }

        public override string Vendor
        {
            get { return "Vendor Name"; }
        }
    }
}

最後にビルドイベントにスナップインのインストール処理を追加します。

"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Installutil.exe" $(TargetPath)


これで、2つのコマンドを実行するだけで、自作の.NETライブラリが利用できるようになりました。

PS > Add-PSSnapin HogeUtil
PS > Import-HogeLibrary