about_Types.ps1xml
簡単な説明
ファイルを使用して、PowerShell で使用 Types.ps1xml
されるオブジェクトの種類を拡張する方法について説明します。
詳細な説明
拡張型データは、PowerShell でオブジェクト型の追加のプロパティとメソッド ("members") を定義します。 PowerShell セッションに拡張型データを追加するには、2 つの手法があります。
Types.ps1xml
file: 拡張型データを定義する XML ファイル。Update-TypeData
: ファイルを再読み込みし、現在のTypes.ps1xml
セッションの型の拡張データを定義するコマンドレット。
このトピックでは、ファイルについて説明します Types.ps1xml
。 コマンドレットを使用して現在のUpdate-TypeData
セッションに動的拡張型データを追加する方法の詳細については、「Update-TypeData」を参照してください。
拡張型データについて
拡張型データは、PowerShell でオブジェクト型の追加のプロパティとメソッド ("members") を定義します。 PowerShell でサポートされている任意の型を拡張し、オブジェクト型で定義されているプロパティを使用するのと同じ方法で、追加されたプロパティとメソッドを使用できます。
たとえば、PowerShell は、コマンドレットから返されるオブジェクトなど、すべてのSystem.DateTime
オブジェクトに DateTime プロパティをGet-Date
追加します。
(Get-Date).DateTime
Sunday, January 29, 2012 9:43:57 AM
PowerShell によってプロパティが追加され、PowerShell でのみ表示されるため、System.DateTime 構造体の説明に DateTime プロパティが見つかりません。
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 ファイル
ディレクトリ内の$PSHOME
ファイルはTypes.ps1xml
、すべてのセッションに自動的に追加されます。
Types.ps1xml
PowerShell インストール ディレクトリ ($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 セッションに追加します。 定義されている組み込み型よりも型を優先する場合は、コマンドレットの PrependData パラメーターを Update-TypeData
使用します。 Update-TypeData
は、現在のセッションにのみ影響します。 今後のすべてのセッションを変更するには、コンソールをエクスポートするか、PowerShell プロファイルに Update-TypeData
コマンドを追加します。
Types.ps1xml と Add-Member
ファイルは Types.ps1xml
、影響を受ける PowerShell セッションで、指定した .NET 型のオブジェクトのすべてのインスタンスにプロパティとメソッドを追加します。 ただし、オブジェクトの 1 つのインスタンスにのみプロパティまたはメソッドを追加する必要がある場合は、コマンドレットを Add-Member
使用します。
詳細については、「Add-Member」を参照してください。
例: FileInfo オブジェクトへの Age メンバーの追加
この例では、System.IO.FileInfo オブジェクトに Age プロパティを追加する方法を示します。 ファイルの有効期間は、作成時刻と現在の時刻 (日数) の差です。
Age プロパティはスクリプト ブロックを使用して計算されるため、新しい 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>
、ファイルで定義されているすべての型を囲みます。 タグは 1 つだけ <Types>
必要です。
ファイルにメンションされる各 .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
Mode プロパティは、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>
タグを囲む必要があります。 プロパティ (またはなど) または<ScriptProperty>
メソッド <Method>
<ScriptMethod>
(またはメソッドなど<NoteProperty>
) を作成するタグは、セットのメンバーにすることができます。
ファイルでは Types.ps1xml
、タグは <MemberSet>
PowerShell で .NET オブジェクトの既定のビューを定義するために使用されます。 この場合、メンバー セットの名前 (タグ内 <Name>
の値) は常に PsStandardMembers であり、プロパティの名前 (タグの <Name>
値) は次のいずれかです。
DefaultDisplayProperty
: オブジェクトの 1 つのプロパティ。DefaultDisplayPropertySet
: オブジェクトの 1 つ以上のプロパティ。DefaultKeyPropertySet
: オブジェクトの 1 つ以上のキー プロパティ。 キー プロパティは、セッション履歴内の項目の ID 数など、プロパティ値のインスタンスを識別します。
たとえば、次の XML は、コマンドレットによって返されるサービス (System.ServiceProcess.ServiceController
オブジェクト) の既定の表示を Get-Service
定義します。 これは、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>
、 <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>
タグを使用して、オブジェクトの既定の表示のプロパティ セットを定義します。 既定の表示は、タグのタグ<MemberSet>
内の PsStandardMembers の値で<Name>
識別できます。
たとえば、次の XML では、3 つの ReferencedProperties を持つ DefaultDisplayPropertySet という名前の PropertySet が作成されます。
<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
管理オブジェクト (System.System.Management.ManagementObject
) のメソッドとConvertFromDateTime
メソッドは、クラスの静的メソッドとToDmtfDateTime
をToDateTime
使用するスクリプト メソッドです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 ソフトウェア開発キット (SDK) を参照してください。
Update-TypeData
PowerShell セッションにファイルを Types.ps1xml
読み込むには、コマンドレットを実行します Update-TypeData
。 ファイル内の型が組み込みTypes.ps1xml
ファイル内の型よりも優先される場合は、次の PrependData パラメーターを追加しますUpdate-TypeData
。 Update-TypeData
は、現在のセッションにのみ影響します。 今後のすべてのセッションを変更するには、セッションをエクスポートするか、PowerShell プロファイルに Update-TypeData
コマンドを追加します。
プロパティで発生する例外、またはコマンドにプロパティを Update-TypeData
追加した場合の例外は、エラーを StdErr
報告しません。 これは、書式設定および出力の際に、多くの一般的な型で発生する例外を抑制します。 .NET プロパティを取得する場合は、次の例に示すように、代わりにメソッド構文を使用して例外の抑制を回避できます。
"hello".get_Length()
メソッドの構文は、.NET プロパティでのみ使用できることに注意してください。 コマンドレットを実行 Update-TypeData
して追加されたプロパティは、メソッド構文を使用できません。
Types.ps1xml ファイルの署名
ファイルのユーザーを Types.ps1xml
保護するには、デジタル署名を使用してファイルに署名します。 詳細については、「about_Signing」を参照してください。
関連項目
PowerShell
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示