トピック about_Types.ps1xml 簡易説明 Windows PowerShell で使用される Microsoft .NET Framework 型のオブジェクトを拡張する Types.ps1xml ファイルについて説明します。 詳細説明 Windows PowerShell のインストール ディレクトリ ($pshome) にある Types.ps1xml ファイルは、 Windows PowerShell で使用されているオブジェクトにプロパティやメソッドを追加できるようにする、XML ベースのテキスト ファイルです。Windows PowerShell には、.NET Framework の型にいくつかの要素を追 加した、組み込みの Types.ps1xml ファイルがあらかじめ用意されています。ただし、別途 Types.ps1xml ファイルを作成して、これらの型を拡張することができます。 たとえば、既定では、配列オブジェクト (System.Array) には、配列内のオブジェクト数を一覧表示する Length プロパティがあります。ただし、"length" という名前ではプロパティの意味が正確に伝わらないた め、Windows PowerShell には、同じ値を表示する、"Count" と名前のエイリアス プロパティが追加されて います。次の XML は、System.Array 型に Count プロパティを追加するものです。 <Type> <Name>System.Array</Name> <Members> <AliasProperty> <Name>Count</Name> <ReferencedMemberName> Length </ReferencedMemberName> </AliasProperty> </Members> </Type> 新しい AliasProperty を取得するには、次の例のように、任意の配列に対して、Get-Member コマンドを使 用します。 Get-Member -inputobject (1,2,3,4) このコマンドを実行すると次の結果が返されます。 Name MemberType Definition ---- ---------- ---------- Count AliasProperty Count = Length Address Method System.Object& Address(Int32 ) Clone Method System.Object Clone() CopyTo Method System.Void CopyTo(Array array, Int32 index): Equals Method System.Boolean Equals(Object obj) Get Method System.Object Get(Int32 ) ... したがって、Windows PowerShell では、Count プロパティまたは Length プロパティのどちらを使用して も同じ結果が得られます。次にその例を示します。 C:\PS> (1, 2, 3, 4).count 4 C:\PS> (1, 2, 3, 4).length 4 Types.ps1xml ファイルの新規作成 Windows PowerShell と共にインストールされた .ps1xml ファイルは、改ざんを防止するためにデジタル 署名されています。書式設定にはスクリプト ブロックを含めることができるためです。したがって、 .NET Framework 型にプロパティまたはメソッドを追加するには、独自の Types.ps1xml ファイルを作成し、 それを Windows PowerShell コンソールに追加するようにします。 新しいファイルを作成するには、まず、既存の Types.ps1xml ファイルをコピーします。新しいファイルに は任意の名前を付けることができますが、ファイル名拡張子 .ps1xml を付ける必要があります。新しいファイ ルは、Windows PowerShell がアクセスできるどのディレクトリにも配置できますが、Windows PowerShell インストール ディレクトリ ($pshome) またはインストール ディレクトリのサブディレクト リに配置すると便利です。 新しいファイルを保存するときに、Update-TypeData コマンドレットを使用して Windows PowerShell コンソールに新規ファイルを追加します。組み込みファイルに定義されている型よりも優先させる型がある場合 は、Update-TypeData コマンドレットの PrependData パラメーターを使用します。Update-TypeData は、現在のコンソールにのみ有効です。将来のすべてのコンソールを変更するには、コンソールをエクスポート するか、Windows PowerShell プロファイルに Update-TypeData コマンドを追加します。 Types.ps1xml と Add-Member Types.ps1xml ファイルでプロパティやメソッドを追加すると、その影響下にある Windows PowerShell コンソールで指定された .NET Framework 型オブジェクトのすべてのインスタンスにそれらのプロパティや メソッドが追加されます。ただし、オブジェクトの特定のインスタンスに対してのみプロパティまたはメソッド を追加する必要がある場合は、Add-Member コマンドレットを使用します。 詳細については、「Add-Member」を参照してください。 例: Age Member を FileInfo オブジェクトに追加する ここでは、ファイル オブジェクト (System.IO.FileInfo) に Age プロパティを追加する例を紹介しま す。ファイルの Age (年齢) とは、作成時刻と現在時刻の差を日数で表したものです。 新しいファイルを作成するには、元の Types.ps1xml ファイルをひな形として使用するのが最も簡単です。 次のコマンドで、$pshome ディレクトリの MyTypes.ps1xml ファイルに元のファイルをコピーします。 copy-item Types.ps1xml MyTypes.ps1xml 次に、XML エディター、またはメモ帳などのテキスト エディターで Types.ps1xml ファイルを開きます。 Age プロパティはスクリプト ブロックを使用して計算されるので、新しい Age プロパティのモデルとして使 用する <ScriptProperty> タグを探します。 このコードの <Type> タグから </Type> タグまでの XML をコピーして、スクリプト プロパティを作成し ます。それ以外の部分は、開始の <?xml> タグと <Types> タグ、および終了の </Types> タグだけを残す ようにして、すべて削除します。また、エラーを防ぐために、デジタル署名は忘れずに削除してください。 元の Types.ps1xml ファイルからスクリプト プロパティをコピーし、次のようなスクリプト プロパティが 完成しました。これをモデルとして使用します。 <?xml version="1.0" encoding="utf-8" ?> <Types> <Type> <Name>System.Guid</Name> <Members> <ScriptProperty> <Name>Guid</Name> <GetScriptBlock>$this.ToString()</GetScriptBlock> </ScriptProperty> </Members> </Type> </Types> 今度は、.NET Framework 型の名前、プロパティの名前、およびスクリプト ブロックの値を変更して、ファ イル オブジェクトの Age プロパティを作成します。 <?xml version="1.0" encoding="utf-8" ?> <Types> <Type> <Name>System.IO.FileInfo</Name> <Members> <ScriptProperty> <Name>Age</Name> <GetScriptBlock> ((get-date) - ($this.creationtime)).days </GetScriptBlock> </ScriptProperty> </Members> </Type> </Types> ファイルを保存して閉じたら、次のように Update-TypeData コマンドを使用して、新しい Types.ps1xml ファイルを現在のコンソールに追加します。このコマンドは、PrependData パラメーターを使用して、新し いファイルの優先順位を元のファイルよりも高くしますUpdate-TypeData の詳細については、「Update- TypeData」を参照してください。 update-typedata -prependpath $pshome\MyTypes.ps1xml 変更内容を確認するために、Get-ChildItem コマンドを使用して、$pshome ディレクトリの PowerShell.exe ファイルを取得し、パイプで Format-List コマンドレットに渡して、このファイルのす べてのプロパティを一覧表示します。変更結果として、Age プロパティが表示されます。 get-childitem $pshome\powershell.exe | format-list -property * PSPath : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS... PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS... PSChildName : powershell.exe PSDrive : C PSProvider : Microsoft.PowerShell.Core\FileSystem PSIsContainer : False Age : 16 VersionInfo : File: C:\WINDOWS\system32\WindowsPow... InternalName: POWERSHELL OriginalFilename: PowerShell.EXE ... 次のコマンドを使用して、ファイルの Age プロパティを表示することもできます。 (get-childitem $pshome\powershell.exe).age 16 Types.ps1xml ファイルの XML <Types> タグは、そのファイルに定義されているすべての型を囲むように存在します。 <Types> タグは 1 対しか存在できません。 このファイルで言及されている各 .NET Framework 型は、1 対の <Type> タグで表現されます。 Type タグは、次のタグを含んでいる必要があります。 <Name>: 対象の .NET Framework 型の名前を囲む 1 対の <Name> タグ。 <Members>: .NET Framework 型に対して定義された新しいプロパティとメソッドのタグを囲む 1 対の <Members> タグ。 <Members> タグ内には、次のメンバー タグを含めることができます。 <AliasProperty>: 既存のプロパティの新しい名前を定義します。 <AliasProperty> タグには、新しいプロパティの名前を定義する 1 対の <Name> タグと、既存のプロ パティを指定する 1 対の <ReferencedMemberName> タグが必要です。たとえば、Count エイリアス プロパティは、配列オブジェクトの Length プロパティのエイリアスです。 <Type> <Name>System.Array</Name> <Members> <AliasProperty> <Name>Count</Name> <ReferencedMemberName>Length</ReferencedMemberName> </AliasProperty> </Members> </Type> <CodeMethod>: .NET Framework クラスの静的メソッドを参照します。 <CodeMethod> タグには、新しいメソッドの名前を定義する 1 対の <Name> タグと、メソッドの定義 先のコードを指定する 1 対の <GetCodeReference> タグが必要です。 たとえば、ディレクトリ (System.IO.DirectoryInfo オブジェクト) の Mode プロパティは、 Windows PowerShell FileSystem プロバイダーに定義されたコード プロパティです。 <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <CodeProperty> <Name>Mode</Name> <GetCodeReference> <TypeName>Microsoft.PowerShell.Commands.FileSystemProvider</TypeName> <MethodName>Mode</MethodName> </GetCodeReference> </CodeProperty> </Members> </Type> <CodeProperty>: .NET Framework クラスの静的メソッドを参照します。 <CodeProperty> タグには、新しいプロパティの名前を定義する 1 対の <Name> タグと、プロパティ の定義先のコードを指定する 1 対の <GetCodeReference> タグが必要です。 たとえば、ディレクトリ (System.IO.DirectoryInfo オブジェクト) の Mode プロパティは、 Windows PowerShell FileSystem プロバイダーに定義されたコード プロパティです。 <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <CodeProperty> <Name>Mode</Name> <GetCodeReference> <TypeName>Microsoft.PowerShell.Commands.FileSystemProvider</TypeName> <MethodName>Mode</MethodName> </GetCodeReference> </CodeProperty> </Members> </Type> <MemberSet>: メンバー (プロパティおよびメソッド) のコレクションを定義します。 <MemberSet> タグは、プライマリ <Members> タグ内に存在する必要があります。このタグは、メンバ ー セットの名前を囲む 1 対の <Name> タグと、そのセット内のメンバー (プロパティおよびメソッド) を囲む 1 対のセカンダリ <Members> タグを含んでいる必要があります。プロパティを作成するタグ (<NoteProperty>、<ScriptProperty> など) やメソッドを作成するタグ (<Method>、 <ScriptMethod> など) はすべて、このセットのメンバーとして追加することができます。 Types.ps1xml ファイルの <MemberSet> タグは、Windows PowerShell における .NET Framework オブジェクトの既定の表示を定義するために使用されます。この場合、メンバー セットの名 前 (<Name> タグの値) は常に "PsStandardMembers" になり、プロパティの名前 (<Name> タグの値) は次のいずれかになります。 - DefaultDisplayProperty: オブジェクトのプロパティ (1 つ)。 - DefaultDisplayPropertySet: オブジェクトのプロパティ (1 つまたは複数)。 - DefaultKeyPropertySet: オブジェクトのキー プロパティ (1 つまたは複数)。キー プロパテ ィは、セッション履歴の項目の ID 番号など、プロパティ値のインスタンスを識別するためのプロパテ ィです。 たとえば、次の XML は、Get-Service コマンドレットから返されるサービス (System.ServiceProcess.ServiceController オブジェクト) の既定の表示を定義します。ここで は、既定のプロパティ セット (Status、Name、DisplayName の各プロパティ) から成る "PsStandardMembers" という名前のメンバー セットを定義しています。 <Type> <Name>System.ServiceProcess.ServiceController</Name> <Members> <MemberSet> <Name>PSStandardMembers</Name> <Members> <PropertySet> <Name>DefaultDisplayPropertySet</Name> <ReferencedProperties> <Name>Status</Name> <Name>Name</Name> <Name>DisplayName</Name> </ReferencedProperties> </PropertySet> </Members> </MemberSet> </Members> </Type> <Method>: 基になるオブジェクトのネイティブ メソッドを参照します。 <Methods>: オブジェクトのメソッドのコレクションです。 <NoteProperty>: 静的な値を持つプロパティを定義します。 <NoteProperty> タグには、新しいプロパティの名前を定義する 1 対の <Name> タグと、その値を指 定する 1 対の <Value> タグが必要です。 たとえば、次の XML は、ディレクトリ (System.IO.DirectoryInfo オブジェクト) の Status プ ロパティを作成します。Status プロパティの値は常に "Success" です。 <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <NoteProperty> <Name>Status</Name> <Value>Success</Value> </NoteProperty> </Members> </Type> <ParameterizedProperty>: 引数を受け取り、値を返すプロパティです。 <Properties>: オブジェクトのプロパティのコレクションです。 <Property>: 基本オブジェクトのプロパティです。 <PropertySet>: オブジェクトのプロパティのコレクションを定義します。 <PropertySet> タグには、プロパティ セットの名前を定義する 1 対の <Name> タグと、セット内の 各プロパティを指定する 1 対の <ReferencedProperty> タグが必要です。プロパティの名前は、1 対の <Name> タグで囲む必要があります。 Types.ps1xml では、<PropertySet> タグを使用して、オブジェクトの既定の表示に対する一連のプロ パティを定義します。既定の表示は、<MemberSet> タグの <Name> タグの値 ("PsStandardMembers") で識別できます。 たとえば、次の XML は、ディレクトリ (System.IO.DirectoryInfo オブジェクト) の Status プ ロパティを作成します。Status プロパティの値は常に "Success" です。 <Type> <Name>System.ServiceProcess.ServiceController</Name> <Members> <MemberSet> <Name>PSStandardMembers</Name> <Members> <PropertySet> <Name>DefaultDisplayPropertySet</Name> <ReferencedProperties> <Name>Status</Name <Name>Name</Name> <Name>DisplayName</Name> </ReferencedProperties> </PropertySet> <Members> <MemberSet> <Members> <Type> <ScriptMethod>: 値がスクリプトの出力であるメソッドを定義します。 <ScriptMethod> タグには、新しいメソッドの名前を指定する 1 対の <Name> タグと、メソッドの結 果を返すスクリプト ブロックを囲む 1 対の <Script> タグが必要です。 たとえば、管理オブジェクト (System.System.Management.ManagementObject) の ConvertToDateTime メソッドおよび ConvertFromDateTime メソッドは、 System.Management.ManagementDateTimeConverter クラスの静的メソッドである ToDateTime お よび ToDmtfDateTime を使ったスクリプト メソッドです。 <Type> <Name>System.Management.ManagementObject</Name> <Members> <ScriptMethod> <Name>ConvertToDateTime</Name> <Script> [System.Management.ManagementDateTimeConverter]::ToDateTime($args[0]) </Script> </ScriptMethod> <ScriptMethod> <Name>ConvertFromDateTime</Name> <Script> [System.Management.ManagementDateTimeConverter]::ToDmtfDateTime($args[0]) </Script> </ScriptMethod> </Members> </Type> <ScriptProperty>: 値がスクリプトの出力であるプロパティを定義します。 <ScriptProperty> タグには、新しいプロパティの名前を指定する 1 対の <Name> タグと、プロパテ ィの値を返すスクリプト ブロックを囲む 1 対の <GetScriptBlock> タグが必要です。 たとえば、ファイル (System.IO.FileInfo objects) の VersionInfo プロパティは、 System.Diagnostics.FileVersionInfo オブジェクトの静的メソッド GetVersionInfo の FullName プロパティの結果として得られるスクリプト プロパティです。 <Type> <Name>System.IO.FileInfo</Name> <Members> <ScriptProperty> <Name>VersionInfo</Name> <GetScriptBlock> [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) </GetScriptBlock> </ScriptProperty> </Members> </Type> 詳細については、MSDN (Microsoft Developer Network) ライブラリの「Windows PowerShell SDK」(https://go.microsoft.com/fwlink/?LinkId=144538) を参照してください。 Update-TypeData Windows PowerShell コンソールに Types.ps1xml ファイルを読み込むには、Update-TypeData コマ ンドレットを使用します。組み込みの Types.ps1xml ファイルに定義されている型よりも、独自に定義したフ ァイルの型を優先させる場合は、Update-TypeData の PrependData パラメーターを使用します。Update- TypeData は、現在のコンソールにのみ有効です。将来のすべてのコンソールを変更するには、コンソールを エクスポートするか、Windows PowerShell プロファイルに Update-TypeData コマンドを追加します。 Types.ps1xml ファイルの署名 Types.ps1xml ファイルのユーザーを保護するには、デジタル署名を使用してこのファイルに署名します。詳 細については、「about_Signing」を参照してください。 関連項目 about_Signing Copy-Item Get-Member Update-TypeData