Windows PowerShell Cmdlet tk-engineering.com
おさらい Windows PowerShellとは… かつて”MONAD”と呼ばれていたものです。 .NET ベースの新しいスクリプト言語です 従来のVBScriptからさらに進化して、COMベースではなく、.NETベースで動くようになります。 .NETベースで動くので、.NETで作られたものとの親和性が高くなります。(型とか…) とにかく、いろいろと便利になります。
今回のお題「コマンドレット」 コマンドレット とは何か VBScriptではどうしていたものか ユーザ独自のシェル拡張です 独自でExeを作って呼び出したり… COM DLL を CreateObjectで呼んだり… そうしていたものを、もっと強力にして…
今回のお題「コマンドレット」-2 コマンドレットは、シェルの一部として動きます コマンドレットは、.NETで作成されます 普通にPowerShellから呼び出せます 例: C:\MSH\> Say-Hello (Say-Hello がコマンドレット) コマンドレットは、.NETで作成されます C#やVB.NETで作成= VSから作成・デバック可能
コマンドレットの作り方-1 まず、新しいShellを作る イロイロなファイルが作成されるので、新しいフォルダを作ることをオススメ。 手順は以下の通り [新しいシェル].cs というファイルが出来るので、 覗いて見るのも一興。 >set-location [作りたいパス] >make-shell –out [新しいシェルの名前] –ns [シェルの名前空間名] (中略) Shell [新しいシェルの名前] is created successfully.
コマンドレットの作り方-2 先ほど作ったシェルを起動してみます やはり、世の中イロイロと難しいようです。 一旦exitで元のShellに戻って、設定を追加します。 注意:表示されるレジストリは環境によって変わります。 > ./[新しいシェル].exe Error loading the extended type data file: Cannot find the registry key: “SOFTWARE\Microsoft\MSH\[名前空間名].newshell\Path”,… (後略)
コマンドレットの作り方-3 新しいシェルに対して各種設定を追加します。 ここまでは「下準備」だったりします。 >$Path = “HKLM:\SOFTWARE\Microsoft\MSH\1\ShellIds\[名前空間名].[シェルの名前] >new-item –type directory $path Hive:Registory::HKEY-LOCAL-MACHINE\...(略) >new-property –path $path –property path –value [新しいシェルのフルパス] MshPath : Registory::HKEY-LOCAL-MACHINE\...(略) >./[新しいシェル].exe
コマンドレットの作り方-4 実際にコマンドレットとなるものを作ります MDCのデモでは、notepadでコードを書いて csc.exe に流し込んでいましたが、それはしません。 素直に VS2005を使用します。 C#-クラスライブラリとして作成します。 System.Management.Automation に対して、参照を追加します。 MONADのインストールフォルダにあります。 using System.Management.Automation;
コマンドレットの作り方-5 実際のクラス定義は… クラスは”Cmdlet”を継承します カスタム属性でコマンド名を定義します ここでは、”say-hello”というコマンドレットを 作成します。 おさらい:こんな訳で必ず「動詞-名詞」の形になります。 [Cmdlet("Say","Hello")] public class MonadTestC1 : Cmdlet {
コマンドレットの作り方-6 パラメータが必要な場合には… プロパティにカスタム属性を付加します。 カスタム属性の説明 Mandatory:true=必須パラメータ Position:順番(0から) VB.NETでも同じようにして作成できます。 [Parameter(Mandatory=true,Position=0)] public string Name { get { return mstrName; } set { mstrName = value; } }
コマンドレットの作り方-7 実際の動作を記述します ProcessRecord を override しているのが ポイントです。 返値の返却に”WriteObject”を使用するのも、 要注意です。(そもそもvoidだし) これにより、MONAD側でのパイプライン使用が可能です。 protected override void ProcessRecord() { WriteObject("Hello " + mstrName); }
コマンドレットの作り方-8 出来上がったDLLをshellに登録します。 以上で「コマンドレット」が使えるようになります。 make-shell -out [新しいシェルの名前] -ns [名前空間名] -reference [コマンドレットのDLL]
まとめ コマンドレットは .NETで作成されます。 コマンドレットの登録には新しいシェルを作成する必要があります。 つまり、必要なコマンドレットを集めた 「オレオレツールボックス」が出来上がります。
リンク Microsoft TechNet (US) http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx Channel 9 http://channel9.msdn.com/