次の方法で共有


about_Types.ps1xml

簡単な説明

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 は、Get-Date コマンドレットが返すオブジェクトなど、すべてのSystem.DateTime オブジェクトに DateTime プロパティを追加します。

(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 ファイル

$PSHOME ディレクトリ内のTypes.ps1xml ファイルは、すべてのセッションに自動的に追加されます。

PowerShell インストール ディレクトリ ($PSHOME) のTypes.ps1xml ファイルは、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 コマンドレットの PrependData パラメーターを使用します。 Update-TypeData は、現在のセッションにのみ影響します。 今後のすべてのセッションを変更するには、コンソールをエクスポートするか、powerShell プロファイルに Update-TypeData コマンドを追加します。

Types.ps1xml と Add-Member

Types.ps1xml ファイルは、影響を受ける PowerShell セッションで、指定した .NET 型のオブジェクトのすべてのインスタンスにプロパティとメソッドを追加します。 ただし、オブジェクトの 1 つのインスタンスにのみプロパティまたはメソッドを追加する必要がある場合は、 Add-Member コマンドレットを使用します。

詳細については、「 メンバーの追加」を参照してください。

例: FileInfo オブジェクトへの Age メンバーの追加

この例では、 Age プロパティを System.IO.FileInfo オブジェクトに追加する方法を示します。 ファイルの有効期間は、作成時刻と現在の時刻 (日数) の差です。

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 コマンドを実行して $PSHOME ディレクトリ内のPowerShell.exe ファイルを取得し、ファイルを 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 オブジェクトの 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> タグを囲む必要があります。 プロパティ ( <NoteProperty><ScriptProperty>など) またはメソッド ( <Method><ScriptMethod>など) を作成するタグは、セットのメンバーにすることができます。

Types.ps1xml ファイルでは、<MemberSet> タグを使用して、PowerShell で .NET オブジェクトの既定のビューを定義します。 この場合、メンバー セットの名前 ( <Name> タグ内の値) は常に PsStandardMembers、プロパティの名前 ( <Name> タグの値) は次のいずれかになります。

  • DefaultDisplayProperty: オブジェクトの 1 つのプロパティ。

  • DefaultDisplayPropertySet: オブジェクトの 1 つ以上のプロパティ。

  • DefaultKeyPropertySet: オブジェクトの 1 つ以上のキー プロパティ。 キー プロパティは、セッション履歴内の項目の ID 数など、プロパティ値のインスタンスを識別します。

たとえば、次の XML は、Get-Service コマンドレットによって返されるサービス (System.ServiceProcess.ServiceController オブジェクト) の既定の表示を定義します。 既定のプロパティ セットと既定の表示プロパティで構成される PsStandardMembers という名前のメンバー セットを定義します。 既定のプロパティ セットは、 StatusName、および 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> タグを使用して、オブジェクトの既定の表示のプロパティ セットを定義します。 既定の表示は、<MemberSet> タグの<Name> タグの値 PsStandardMembers で識別できます。

たとえば、次の XML では、DefaultDisplayPropertySet という名前の PropertySet ReferencedProperties が作成されます。

<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> タグが必要です。

たとえば、管理オブジェクト (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> タグには、新しいプロパティの名前を指定する<Name> タグと、プロパティ値を返すスクリプト ブロックを囲む<GetScriptBlock> タグが必要です。

たとえば、System.IO.FileInfo オブジェクトの VersionInfo プロパティは、System.Diagnostics.FileVersionInfo オブジェクトの静的メソッド GetVersionInfoFullName プロパティを使用した結果のスクリプト プロパティです。

<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-TypeDataPrependData パラメーターを追加します。 Update-TypeData は、現在のセッションにのみ影響します。 今後のすべてのセッションを変更するには、セッションをエクスポートするか、 Update-TypeData コマンドを PowerShell プロファイルに追加します。

プロパティで発生する例外、またはプロパティを Update-TypeData コマンドに追加した場合、エラーは StdErrに報告されません。 これは、書式設定および出力の際に、多くの一般的な型で発生する例外を抑制します。 .NET プロパティを取得する場合は、次の例に示すように、代わりにメソッド構文を使用して例外の抑制を回避できます。

"hello".get_Length()

メソッドの構文は、.NET プロパティでのみ使用できることに注意してください。 Update-TypeData コマンドレットを実行して追加されたプロパティは、メソッド構文を使用できません。

Types.ps1xml ファイルの署名

Types.ps1xml ファイルのユーザーを保護するには、デジタル署名を使用してファイルに署名します。 詳細については、「 about_Signing」を参照してください。

関連項目