次の方法で共有


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 より前のバージョンでは、型定義は PowerShell インストール ディレクトリ ($PSHOME) にファイルを格納していましたTypes.ps1xml

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 セッションに追加します。 定義されている組み込み型よりも型を優先する場合は、コマンドレットの PrependData パラメーターを Update-TypeData 使用します。 Update-TypeData は、現在のセッションにのみ影響します。 今後のすべてのセッションを変更するには、コンソールをエクスポートするか、コマンドを Update-TypeData PowerShell プロファイルに追加します。

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.DirectoryInfoMode プロパティは、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>など<NoteProperty>) またはメソッド <Method><ScriptMethod>(や など) を作成するタグは、セットのメンバーにすることができます。

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

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

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

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

たとえば、次の XML は、 コマンドレットによって返されるサービス (System.ServiceProcess.ServiceController オブジェクト) の既定の表示を Get-Service 定義します。 これは、StatusNameおよび 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 では、DefaultDisplayPropertySet という名前の PropertySet が 3 つの 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> 返すスクリプト ブロックを囲むタグが必要です。

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

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

"hello".get_Length()

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

Types.ps1xml ファイルの署名

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

こちらもご覧ください