2009年12月22日火曜日

PowerShellの「モジュール」について、その3

今回も、MSDNの記事の大雑把なまとめ&和訳記事です。
内容がかなり怪しいので、MSDNの本文を確認する必要ありです
(ブログの本文も、理解できたところから随時修正します)。

---
前回の続きです。
New-ModuleManifestで生成したpsd1ファイルには、
コマンドレットで指定しなかった項目がたくさんできています。
これら拡張項目は、psd1ファイルを直接編集して指定することになります。
以下、キー名と指定する内容を列挙します。

キーワード名 ざっくりとした説明
Versionモジュールのバージョン。デフォルトは「1.0」。
GUIDモジュールを一意に識別するためのID。
デフォルトは、マニフェストが作成された際にPowerShellにより作成されるGUID。
PowerShellVersionこのモジュールが動作するPowerShellの、最小バージョンの番号を指定。
PowerShellHostNameモジュールが動作するPowerShellホストを指定。
PowerShellHostVersionモジュールが動作するPowerShellホストの、最小バージョンの番号を指定。
DotNetFrameworkVersionモジュールが動作する.NET Frameworkの、最小バージョンの番号を指定。
CLRVersionモジュールが動作するCLRの、最小バージョンの番号を指定。
ProcessorArchitectureモジュールが動作するプロセッサアーキテクチャを指定。
ScriptsToProcessモジュールのインポート時にcaller's session stateで実行される
スクリプトファイル(.ps1)を列挙。
※モジュール実行環境の構築に使用できそうですね。
FunctionsToExportモジュールがcaller's session stateにエクスポートする関数を列挙。ワイルドカードによる指定も可能。
既定では、全関数がエクスポートされる。
CmdletsToExportモジュールがcaller's session stateにエクスポートするコマンドレットを列挙。ワイルドカードによる指定も可能です。
既定では、全コマンドレットがエクスポートされる。
VariablesToExportモジュールがcaller's session stateにエクスポートする変数を列挙。ワイルドカードによる指定も可能。
既定では、全変数がエクスポートされる。
AliasesToExportモジュールがcaller's session stateにエクスポートするエイリアスを列挙。ワイルドカードによる指定も可能。
既定では、全エイリアスがエクスポートされる。
ModuleList該モジュールにパッケージされた全モジュールをcsv形式で列挙。
PrivateDataModuleToProcessで指定したルートモジュールに渡す必要のあるprivateデータを指定。
RequiredModulesモジュールのインポートに先立ちインポートされている必要のある
モジュールを列挙。

編集完了後には、忘れずにファイルを保存しましょう。

参考サイト
How to Write a Module Manifest
Writing a Windows PowerShell Module

PowerShellの「モジュール」について、その2

今回も、MSDNの記事の大雑把なまとめ&和訳記事です。
内容がかなり怪しいので、MSDNの本文を確認する必要ありです
(ブログの本文も、理解できたところから随時修正します)。

---
先日の記事の続きです。モジュールの作り方には2通りあります。
モジュールマニフェストファイル(拡張子psd1のファイル)を直接作るか、
New-ModuleManifestコマンドレットで直接指定するか、のどちらかです。

New-ModuleManifestでpsd1ファイルを作成する場合、
画面の出力に合わせて、いくつかの項目を入力することになります。
これらはpsd1最終的にはpsd1ファイルに反映されます。

以下、このコマンドレットで入力する情報とその内容を列挙します。
よくわからない項目はタイトルを青文字の斜体で書いておき、
わかり次第追記していくこととします。

キーワード名 ざっくりとした説明
Path新しく作成するモジュールマニフェストファイルのパスを指定。
ファイルの拡張子は「psd1」とする必要がある。
NestedModules[]入れ子モジュールとしてインポートするスクリプトモジュールファイル(.psm1)やアセンブリ(.dll)を列挙する。
入れ子モジュールのメンバは、明示的にエクスポートを実施しない限り、ルートモジュール(ModuleToProcessにて指定)からのみ参照可能となる。
Author製作者名。
CompanyName会社名。
Copyrightモジュールのコピーライト情報。
ModuleToProcessルートモジュールとして、psm1ファイル又はDLLを1つ指定する。
ここで指定したファイルは、GlobalSessionStateにインポートされることになる。省略した場合には、そのマニフェスト自身がルートモジュールとみなされる。
Descriptionモジュールマニフェストの簡単な説明を記述する。
TypesToProcess[]モジュールのインポート時に読み込まれる型ファイル(type files)を列挙する。PowerShellは、タイプファイルを元に.NET Frameworkのタイプにメンバを追加する。
省略時は、空リストとみなされる。
FormatsToProcess[]モジュールのインポート時に読み込まれる書式ファイル(formatting files)を列挙する。
省略時は、空リストとみなされる。
RequiredAssemblies[]モジュールで使用するアセンブリファイルを列挙する。
省略時は、空リストとみなされる。
FileList[]モジュールに含まれるすべてのファイルを指定する。
省略時は、空リストとみなされる。

これらが終わると、Pathで指定した先にpsd1ファイルが作成され、
以後、Import-Moduleでモジュールを使用できるようになります。
ちなみに、すべてのセッションにインポートしたい場合は、
プロファイルにImport-Moduleコマンドレットを追加する必要があります。

作成例:
New-ModuleManifestコマンドで作成する例です。

PS D:\> New-ModuleManifest

コマンド パイプライン位置 1 のコマンドレット New-ModuleManifest
次のパラメーターに値を指定してください:
Path: D:\MyModule.psd1
NestedModules[0]:
Author: 作者名
CompanyName: 作者名
Copyright: コピーライト
ModuleToProcess:
Description: 説明は簡潔に書きましょう。
TypesToProcess[0]:
FormatsToProcess[0]:
RequiredAssemblies[0]:
FileList[0]:
PS D:\>


FileListの後ろにエラーが出なければ、
最初にPathで指定したpsd1ファイルができているはずです。
今回の場合、↓のようなファイルが出力されました。

# MyModule.psd1
# 以下、見やすさを考えて若干レイアウトに手を加えています。
# モジュール 'MyModule' のモジュール マニフェスト
# 生成者: 作者名
# 生成日: 2009/12/22
@{
# ModuleToProcess に指定されているモジュールの入れ子になったモジュールとしてインポートするモジュール
NestedModules = @()
# このモジュールの作成者
Author = '作者名'
# このモジュールの会社またはベンダー
CompanyName = '作者名'
# このモジュールの著作権情報
Copyright = 'コピーライト'
# このマニフェストに関連付けられているスクリプト モジュール ファイルまたはバイナリ モジュール ファイル
ModuleToProcess = ''
# このモジュールの機能の説明
Description = '説明は簡潔に書きましょう。'
# このモジュールをインポートするときに読み込まれる型ファイル (.ps1xml)
TypesToProcess = @()
# このモジュールをインポートするときに読み込まれる書式ファイル (.ps1xml)
FormatsToProcess = @()
# このモジュールをインポートする前に読み込まれている必要があるアセンブリ
RequiredAssemblies = @()
# このモジュールに同梱されているすべてのファイルのリスト
FileList = @()
# このモジュールのバージョン番号です。
ModuleVersion = '1.0'
# このモジュールを一意に識別するために使用される ID
GUID = '3b6c99fd-98f2-47c4-84d5-aa953a7ce6b3'
# このモジュールに必要な Windows PowerShell エンジンの最小バージョン
PowerShellVersion = ''
# このモジュールに必要な Windows PowerShell ホストの名前
PowerShellHostName = ''
# このモジュールに必要な Windows PowerShell ホストの最小バージョン
PowerShellHostVersion = ''
# このモジュールに必要な .NET Framework の最小バージョン
DotNetFrameworkVersion = ''
# このモジュールに必要な共通言語ランタイム (CLR) の最小バージョン
CLRVersion = ''
# このモジュールに必要なプロセッサ アーキテクチャ (なし、X86、Amd64、IA64)
ProcessorArchitecture = ''
# このモジュールをインポートする前に呼び出し元の環境で実行されるスクリプト ファイル (.ps1)
ScriptsToProcess = @()
# このモジュールからエクスポートする関数
FunctionsToExport = '*'
# このモジュールからエクスポートするコマンドレット
CmdletsToExport = '*'
# このモジュールからエクスポートする変数
VariablesToExport = '*'
# このモジュールからエクスポートするエイリアス
AliasesToExport = '*'
# このモジュールに同梱されているすべてのモジュールのリスト
ModuleList = @()
# ModuleToProcess に指定されているモジュールに渡すプライベート データ
PrivateData = ''
# このモジュールをインポートする前にグローバル環境にインポートされている必要があるモジュール
RequiredModules = @()
}


New-ModuleManifestでは指定していないものもたくさん出てきています。
自動生成されたコメントで何を示すものかは大体検討がつくと思いますが、
次の投稿で簡単に説明を書いてみることにします。

参考サイト
How to Write a Module Manifest
Writing a Windows PowerShell Module

PowerShellの「モジュール」について

今回は、MSDNの記事の大雑把なまとめ&和訳記事です。
内容がかなり怪しいので、MSDNの本文を確認する必要ありです
(ブログの本文も、理解できたところから随時修正します)。

---
PowerShellには「モジュール」という仕組みがあります。
PerlやPythonにある「モジュール」と似たようなものになります。
用途例としては、以下があげられます。

①ライブラリとして(Library)
→ 共通処理をまとめたパッケージとして使用可能。
  さまざまなクラスから共有される.NETクラスのようなイメージ。

②環境設定にて(configulation)
→ コマンドレットを呼び出した際の環境設定に使用可能。
  ドットソースやProfileファイル($Profile)を使うのと同じ感じ。

③アプリケーションにて(Application)
→ 既存の機能を再パッケージしたりカスタマイズするときに使用可能。
  あるパッケージを、特定の状況下でのみで適用・使用、というも可能。

④要コンパイルのコード開発とコンパイル済みモジュールの配布にて
 (Compiled Code Development and Distribution)
→ SnapInを作成せずとも作成したコンパイル済みモジュールを使用可能。


共通関数を作ったり実行環境をカスタマイズするのに使える…便利そうです。
PowerShellである程度の規模のものを作っていけば、
自ずとその恩恵を受けることになるのでしょう、たぶん。


では、モジュールは一体どう作ればいいかという話なのですが…
それはまた次の投稿で書くこととします。

参考サイト
How to Write a Module Manifest

2009年12月19日土曜日

PowerShellのパラメータ属性に関するメモ

関数やスクリプトに引数を指定させる場合、
Paramブロックの中に引数名等の情報を記述できる他、
各パラメータに対して入力規則や規定値なんかも設定できます。

属性名ざっくりとした説明
[.NET Frameworkクラス名]$変数名 変数の型を指定。デフォルトでは変数には任意の型を代入可。
$変数 = デフォルト値を指定。
Position = 整数 パラメータの設定する位置を指定。
Mandatory = $True 必須指定オプションの場合に$Trueを指定。
ValueFromPipeline = $True パイプラインから流れてきたオブジェクトそのものを使用できるようにする場合に指定。
ValueFromPipelineByPropertyName = $True パイプラインから流れてきたオブジェクトの持つプロパティとパラメータをバインドする場合に指定。
ParameterSetName = パラメータセット名 パラメータセット名を指定。省略時は、全パラメータセットに含まれると見なされる。
HelpMessage = 説明メッセージ パラメータの説明メッセージを指定。

実装例:
sample1.ps1とsample2.ps1からは、同一の出力が得られます。
# sample1.ps1
Function Test-Sample01
{
Param
(
# パイプラインより受けとったオブジェクトの、Nameプロパティの内容を受け取る。
[Parameter(Position=0, Mandatory = $True, ValueFromPipelineByPropertyName = $True)]$Name,
[Parameter(Position=1, Mandatory = $True)][string]$MyString,
# スイッチパラメータの指定
[Parameter(Position=2)][switch]$MySwitch
)
Process
{ $Name + $MyString +$MySwitch.ToString() | Out-Host }
}
Get-Process | Test-Sample01 -MyString "Test" -MySwitch

# sample2.ps1
Function Test-Sample02
{
Param
(
# パイプラインより受け取ったオブジェクトをそのまま使用。
[Parameter(Position=0, Mandatory = $True, ValueFromPipeline = $True)]$Object,
# 変数MyStringのデフォルト値は"Test"
[Parameter(Position=1, HelpMessage="My string...")][string]$MyString = "Test",
[Parameter(Position=2)][switch]$MySwitch
)
Process
{ $Object.Name + $MyString + $MySwitch.ToString()| Out-Host}
}
Get-Process | Test-Sample02 -MySwitch



参考サイト:
スクリプトセンター(TechNet)
IIS 7.0 向けの PowerShell コマンドレットの作成(TechNet)
Hiro's .NET Blog
パラメータセットの説明

参考コマンド:

Get-Help About_Functions_Advanced_Parameters