MONAD Commandlet - tkinugaw`s programming labo

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