簡単な説明
Types.ps1xml
ファイルを使用して、PowerShell で使用されるオブジェクトの種類を拡張する方法について説明します。
詳細な説明
拡張型データは、PowerShell でオブジェクト型の追加のプロパティとメソッド ("members") を定義します。 PowerShell セッションに拡張型データを追加するには、2 つの手法があります。
-
Types.ps1xml
file: 拡張型データを定義する XML ファイル。 -
Update-TypeData
:Types.ps1xml
ファイルを再読み込みし、現在のセッションの型の拡張データを定義するコマンドレット。
このトピックでは、 Types.ps1xml
ファイルについて説明します。
Update-TypeData
コマンドレットを使用して現在のセッションに動的拡張型データを追加する方法の詳細については、「Update-TypeDataを参照してください。
拡張型データについて
拡張型データは、PowerShell でオブジェクト型の追加のプロパティとメソッド ("members") を定義します。 PowerShell でサポートされている任意の型を拡張し、オブジェクト型で定義されているプロパティを使用するのと同じ方法で、追加されたプロパティとメソッドを使用できます。
たとえば、PowerShell は、 コマンドレットが返すオブジェクトなど、すべてのSystem.DateTime
オブジェクトに Get-Date
プロパティを追加します。
(Get-Date).DateTime
Sunday, January 29, 2012 9:43:57 AM
DateTime プロパティは、System.DateTime 構造体の説明に見つかりません。これは、PowerShell によってプロパティが追加され、PowerShell でのみ表示されるためです。
PowerShell は、拡張型の既定のセットを内部的に定義します。 この種類の情報は、起動時にすべての PowerShell セッションに読み込まれます。
DateTime プロパティは、この既定のセットの一部です。 PowerShell 6 より前のバージョンでは、型定義は、 Types.ps1xml
ファイルを PowerShell インストール ディレクトリ ($PSHOME
) に格納していました。
PowerShell への拡張型データの追加
PowerShell セッションには、拡張型データの 3 つのソースがあります。
拡張型データは PowerShell によって定義され、すべての PowerShell セッションに自動的に読み込まれます。 PowerShell 6 以降では、この情報は PowerShell にコンパイルされ、
Types.ps1xml
ファイルには配布されなくなります。モジュールがエクスポートする
Types.ps1xml
ファイルは、モジュールが現在のセッションにインポートされるときに読み込まれます。Update-TypeData
コマンドレットを使用して定義された拡張型データは、現在のセッションにのみ追加されます。 ファイルには保存されません。
セッションでは、3 つのソースからの拡張型データが同じ方法でオブジェクトに適用され、指定された型のすべてのオブジェクトで使用できます。
TypeData コマンドレット
次のコマンドレットは、PowerShell 3.0 以降の Microsoft.PowerShell.Utility モジュールに含まれています。
-
Get-TypeData
: 現在のセッションの拡張型データを取得します。 -
Update-TypeData
:Types.ps1xml
ファイルを再読み込みします。 現在のセッションに拡張型データを追加します。 -
Remove-TypeData
: 現在のセッションから拡張型データを削除します。
これらのコマンドレットの詳細については、各コマンドレットのヘルプ トピックを参照してください。
組み込みの Types.ps1xml ファイル
Types.ps1xml
ディレクトリ内の$PSHOME
ファイルは、すべてのセッションに自動的に追加されます。
PowerShell インストール ディレクトリ (Types.ps1xml
) の$PSHOME
ファイルは、PowerShell で使用されるオブジェクトにプロパティとメソッドを追加できる XML ベースのテキスト ファイルです。 PowerShell には、.NET 型にいくつかの要素を追加する組み込みの Types.ps1xml
ファイルがありますが、追加の Types.ps1xml
ファイルを作成して型をさらに拡張できます。
たとえば、既定では、配列オブジェクト (System.Array
) には、配列内のオブジェクトの数を一覧表示する Length プロパティがあります。 ただし、名前 Length ではプロパティが明確に記述されていないため、PowerShell は同じ値を表示する Count という名前のエイリアス プロパティを追加します。 次の XML は、 Count プロパティを System.Array
型に追加します。
<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)
# ...
その結果、PowerShell で配列の Count プロパティまたは Length プロパティを使用できます。 次に例を示します。
(1, 2, 3, 4).Count
4
(1, 2, 3, 4).Length
4
新しい Types.ps1xml ファイルの作成
PowerShell でインストールされている .ps1xml
ファイルは、書式設定にスクリプト ブロックを含めることができるため、改ざんを防ぐためにデジタル署名されます。 そのため、プロパティまたはメソッドを .NET 型に追加するには、独自の Types.ps1xml
ファイルを作成し、PowerShell セッションに追加します。
新しいファイルを作成するには、まず既存の Types.ps1xml
ファイルをコピーします。 新しいファイルには任意の名前を付けることができますが、 .ps1xml
ファイル名拡張子が必要です。 新しいファイルは、PowerShell からアクセスできる任意のディレクトリに配置できますが、PowerShell インストール ディレクトリ ($PSHOME
) またはインストール ディレクトリのサブディレクトリにファイルを配置すると便利です。
新しいファイルを保存したら、 Update-TypeData
コマンドレットを使用して新しいファイルを PowerShell セッションに追加します。 定義されている組み込み型よりも型を優先する場合は、 コマンドレットの Update-TypeData
パラメーターを使用します。
Update-TypeData
は、現在のセッションにのみ影響します。 今後のすべてのセッションを変更するには、コンソールをエクスポートするか、powerShell プロファイルに Update-TypeData
コマンドを追加します。
Types.ps1xml と Add-Member
Types.ps1xml
ファイルは、影響を受ける PowerShell セッションで、指定した .NET 型のオブジェクトのすべてのインスタンスにプロパティとメソッドを追加します。 ただし、オブジェクトの 1 つのインスタンスにのみプロパティまたはメソッドを追加する必要がある場合は、 Add-Member
コマンドレットを使用します。 詳細については、「 メンバーの追加」を参照してください。
例: FileInfo オブジェクトへの Age メンバーの追加
この例では、 Age プロパティを System.IO.FileInfo オブジェクトに追加する方法を示します。 ファイルの有効期間は、作成時刻と現在の時刻 (日数) の差です。
Age プロパティはスクリプト ブロックを使用して計算されるため、新しい <ScriptProperty>
プロパティのモデルとして使用する タグを見つけます。
次の XML コードをファイル $PSHOME\MyTypes.ps1xml
に保存します。
<?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
コマンドを実行して powershell.exe
ディレクトリ内の $PSHOME
ファイルを取得し、ファイルを Format-List
コマンドレットにパイプして、ファイルのすべてのプロパティを一覧表示します。 変更の結果、 Age プロパティが一覧に表示されます。
Get-ChildItem $PSHOME\pwsh.exe | Select-Object Age
142
Types.ps1xml ファイル内の XML
完全なスキーマ定義は、GitHub の PowerShell ソース コード リポジトリの Types.xsd にあります。
<Types>
タグは、ファイルで定義されているすべての型を囲みます。
<Types>
タグは 1 つだけ必要です。
ファイルに記載されている各 .NET 型は、 <Type>
タグで表す必要があります。
型タグには、次のタグが含まれている必要があります。
<Name>
: 影響を受ける .NET 型の名前を囲みます。
<Members>
: .NET 型に対して定義されている新しいプロパティとメソッドのタグを囲みます。
次のメンバー タグは、 <Members>
タグ内に含めることができます。
AliasProperty
既存のプロパティの新しい名前を定義します。
<AliasProperty>
タグには、新しいプロパティの名前を指定する<Name>
タグと、既存のプロパティを指定する<ReferencedMemberName>
タグが必要です。
たとえば、 Count エイリアス プロパティは、配列オブジェクトの Length プロパティのエイリアスです。
<Type>
<Name>System.Array</Name>
<Members>
<AliasProperty>
<Name>Count</Name>
<ReferencedMemberName>Length</ReferencedMemberName>
</AliasProperty>
</Members>
</Type>
CodeMethod
.NET クラスの静的メソッドを参照します。
<CodeMethod>
タグには、新しいメソッドの名前を指定する<Name>
タグと、メソッドが定義されているコードを指定する<CodeReference>
タグが必要です。
たとえば、 ToString メソッドは、 Microsoft.PowerShell.ToStringCodeMethods コード定義の名前です。
<Type>
<Name>System.Xml.XmlNode</Name>
<Members>
<CodeMethod>
<Name>ToString</Name>
<CodeReference>
<TypeName>Microsoft.PowerShell.ToStringCodeMethods</TypeName>
<MethodName>XmlNode</MethodName>
</CodeReference>
</CodeMethod>
</Members>
</Type>
CodeProperty
.NET クラスの静的メソッドを参照します。
<CodeProperty>
タグには、新しいプロパティの名前を指定する<Name>
タグと、プロパティが定義されているコードを指定する<GetCodeReference>
タグが必要です。
たとえば、 オブジェクトの System.IO.DirectoryInfo
プロパティは、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>
タグ内に表示されます。 タグは、メンバー セットの名前を囲む <Name>
タグと、セット内のメンバー (プロパティとメソッド) を囲むセカンダリ <Members>
タグを囲む必要があります。 プロパティ ( <NoteProperty>
や <ScriptProperty>
など) またはメソッド ( <Method>
や <ScriptMethod>
など) を作成するタグは、セットのメンバーにすることができます。
Types.ps1xml
ファイルでは、<MemberSet>
タグを使用して、PowerShell で .NET オブジェクトの既定のビューを定義します。 この場合、メンバー セットの名前 ( <Name>
タグ内の値) は常に PsStandardMembers、プロパティの名前 ( <Name>
タグの値) は次のいずれかになります。
DefaultDisplayProperty
: オブジェクトの 1 つのプロパティ。DefaultDisplayPropertySet
: オブジェクトの 1 つ以上のプロパティ。DefaultKeyPropertySet
: オブジェクトの 1 つ以上のキー プロパティ。 キー プロパティは、セッション履歴内の項目の ID 数など、プロパティ値のインスタンスを識別します。
たとえば、次の XML は、System.ServiceProcess.ServiceController
コマンドレットによって返されるサービス (Get-Service
オブジェクト) の既定の表示を定義します。 既定のプロパティ セットと既定の表示プロパティで構成される PsStandardMembers という名前のメンバー セットを定義します。 既定のプロパティ セットは、 Status、 Name、および DisplayName プロパティとして定義されます。 既定の表示プロパティを Name として定義します。
<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>
<NoteProperty>
<Name>DefaultDisplayProperty</Name>
<Value>Name</Value>
</NoteProperty>
</Members>
</MemberSet>
</Members>
</Type>
<Method>
: 基になるオブジェクトのネイティブ メソッドを参照します。
<Methods>
: オブジェクトのメソッドのコレクション。
NoteProperty
静的な値を持つプロパティを定義します。
<NoteProperty>
タグには、新しいプロパティの名前を指定する<Name>
タグと、プロパティの値を指定する<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>
PropertySet
引数を受け取り、値を返すプロパティ。
<Properties>
: オブジェクトのプロパティのコレクション。
<Property>
: 基本オブジェクトのプロパティ。
<PropertySet>
: オブジェクトのプロパティのコレクションを定義します。
<PropertySet>
タグには、プロパティ セットの名前を指定する<Name>
タグと、プロパティを指定する<ReferencedProperty>
タグが必要です。 プロパティの名前は、 <Name>
タグで囲まれています。
Types.ps1xml
では、<PropertySet>
タグを使用して、オブジェクトの既定の表示のプロパティ セットを定義します。 既定の表示は、 タグの<Name>
タグの値 <MemberSet>
で識別できます。
たとえば、次の XML では、DefaultDisplayPropertySet という名前の PropertySetReferencedProperties が作成されます。
<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>
タグには、新しいメソッドの名前を指定する<Name>
タグと、メソッドの結果を返すスクリプト ブロックを囲む<Script>
タグが必要です。
たとえば、管理オブジェクト (ConvertToDateTime
) のConvertFromDateTime
メソッドとSystem.System.Management.ManagementObject
メソッドは、ToDateTime
クラスのToDmtfDateTime
およびSystem.Management.ManagementDateTimeConverter
静的メソッドを使用するスクリプト メソッドです。
<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>
タグには、新しいプロパティの名前を指定する<Name>
タグと、プロパティ値を返すスクリプト ブロックを囲む<GetScriptBlock>
タグが必要です。
たとえば、System.IO.FileInfo オブジェクトの 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>
詳細については、「 Windows PowerShell Software Development Kit (SDK)を参照してください。
Update-TypeData
Types.ps1xml
ファイルを PowerShell セッションに読み込むには、Update-TypeData
コマンドレットを実行します。 組み込みのTypes.ps1xml
ファイル内の型よりもファイル内の型を優先する場合は、の Update-TypeData
パラメーターを追加します。
Update-TypeData
は、現在のセッションにのみ影響します。 今後のすべてのセッションを変更するには、セッションをエクスポートするか、 Update-TypeData
コマンドを PowerShell プロファイルに追加します。
プロパティで発生する例外、またはプロパティを Update-TypeData
コマンドに追加した場合、エラーは StdErr
に報告されません。 これは、書式設定および出力の際に、多くの一般的な型で発生する例外を抑制します。 .NET プロパティを取得する場合は、次の例に示すように、代わりにメソッド構文を使用して例外の抑制を回避できます。
"hello".get_Length()
メソッドの構文は、.NET プロパティでのみ使用できることに注意してください。
Update-TypeData
コマンドレットを実行して追加されたプロパティは、メソッド構文を使用できません。
Types.ps1xml ファイルの署名
Types.ps1xml
ファイルのユーザーを保護するには、デジタル署名を使用してファイルに署名します。 詳細については、「 about_Signing」を参照してください。
関連項目
PowerShell