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、NameDisplayName プロパティを持つ既定のプロパティ セットで構成される 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メソッドは、クラスの静的メソッドとToDmtfDateTimeToDateTime使用するスクリプト メソッドです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-TypeDataUpdate-TypeData は、現在のセッションにのみ影響します。 今後のすべてのセッションを変更するには、セッションをエクスポートするか、PowerShell プロファイルに Update-TypeData コマンドを追加します。

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

"hello".get_Length()

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

Types.ps1xml ファイルの署名

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

関連項目