トピック
    about_Types.ps1xml

簡易説明
    Windows PowerShell で使用される Microsoft .NET Framework 型のオブジェクトを拡張する 
    Types.ps1xml ファイルについて説明します。

詳細説明
    Windows PowerShell のインストール ディレクトリ ($pshome) にある Types.ps1xml ファイルは、
    Windows PowerShell で使用されているオブジェクトにプロパティやメソッドを追加できるようにする、XML 
    ベースのテキスト ファイルです。Windows PowerShell には、.NET Framework の型にいくつかの要素を追
    加した、組み込みの Types.ps1xml ファイルがあらかじめ用意されています。ただし、別途 Types.ps1xml 
    ファイルを作成して、これらの型を拡張することができます。

    たとえば、既定では、配列オブジェクト (System.Array) には、配列内のオブジェクト数を一覧表示する 
    Length プロパティがあります。ただし、"length" という名前ではプロパティの意味が正確に伝わらないた
    め、Windows PowerShell には、同じ値を表示する、"Count" と名前のエイリアス プロパティが追加されて
    います。次の XML は、System.Array 型に Count プロパティを追加するものです。

        <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 )
	...

    したがって、Windows PowerShell では、Count プロパティまたは Length プロパティのどちらを使用して
    も同じ結果が得られます。次にその例を示します。

	C:\PS> (1, 2, 3, 4).count
	4

	C:\PS> (1, 2, 3, 4).length
	4
 

  Types.ps1xml ファイルの新規作成

      Windows PowerShell と共にインストールされた .ps1xml ファイルは、改ざんを防止するためにデジタル
      署名されています。書式設定にはスクリプト ブロックを含めることができるためです。したがって、
      .NET Framework 型にプロパティまたはメソッドを追加するには、独自の Types.ps1xml ファイルを作成し、
      それを Windows PowerShell コンソールに追加するようにします。

      新しいファイルを作成するには、まず、既存の Types.ps1xml ファイルをコピーします。新しいファイルに
      は任意の名前を付けることができますが、ファイル名拡張子 .ps1xml を付ける必要があります。新しいファイ
      ルは、Windows PowerShell がアクセスできるどのディレクトリにも配置できますが、Windows 
      PowerShell インストール ディレクトリ ($pshome) またはインストール ディレクトリのサブディレクト
      リに配置すると便利です。

      新しいファイルを保存するときに、Update-TypeData コマンドレットを使用して Windows PowerShell 
      コンソールに新規ファイルを追加します。組み込みファイルに定義されている型よりも優先させる型がある場合
      は、Update-TypeData コマンドレットの PrependData パラメーターを使用します。Update-TypeData 
      は、現在のコンソールにのみ有効です。将来のすべてのコンソールを変更するには、コンソールをエクスポート
      するか、Windows PowerShell プロファイルに Update-TypeData コマンドを追加します。


  Types.ps1xml と Add-Member

      Types.ps1xml ファイルでプロパティやメソッドを追加すると、その影響下にある Windows PowerShell 
      コンソールで指定された .NET Framework 型オブジェクトのすべてのインスタンスにそれらのプロパティや
      メソッドが追加されます。ただし、オブジェクトの特定のインスタンスに対してのみプロパティまたはメソッド
      を追加する必要がある場合は、Add-Member コマンドレットを使用します。

      詳細については、「Add-Member」を参照してください。


  例: Age Member を FileInfo オブジェクトに追加する

      ここでは、ファイル オブジェクト (System.IO.FileInfo) に Age プロパティを追加する例を紹介しま
      す。ファイルの Age (年齢) とは、作成時刻と現在時刻の差を日数で表したものです。

      新しいファイルを作成するには、元の Types.ps1xml ファイルをひな形として使用するのが最も簡単です。
      次のコマンドで、$pshome ディレクトリの MyTypes.ps1xml ファイルに元のファイルをコピーします。

          copy-item Types.ps1xml MyTypes.ps1xml


      次に、XML エディター、またはメモ帳などのテキスト エディターで Types.ps1xml ファイルを開きます。
      Age プロパティはスクリプト ブロックを使用して計算されるので、新しい Age プロパティのモデルとして使
      用する <ScriptProperty> タグを探します。

      このコードの <Type> タグから </Type> タグまでの XML をコピーして、スクリプト プロパティを作成し
      ます。それ以外の部分は、開始の <?xml> タグと <Types> タグ、および終了の </Types> タグだけを残す
      ようにして、すべて削除します。また、エラーを防ぐために、デジタル署名は忘れずに削除してください。

      元の Types.ps1xml ファイルからスクリプト プロパティをコピーし、次のようなスクリプト プロパティが
      完成しました。これをモデルとして使用します。

          <?xml version="1.0" encoding="utf-8" ?>
          <Types>
              <Type>
                 <Name>System.Guid</Name>
                    <Members>
                        <ScriptProperty>
                            <Name>Guid</Name>
                            <GetScriptBlock>$this.ToString()</GetScriptBlock>
                        </ScriptProperty>
                    </Members>
              </Type>
          </Types>


      今度は、.NET Framework 型の名前、プロパティの名前、およびスクリプト ブロックの値を変更して、ファ
      イル オブジェクトの Age プロパティを作成します。


          <?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\powershell.exe | format-list -property *	


        PSPath            : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS...
        PSParentPath      : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS...
        PSChildName       : powershell.exe
        PSDrive           : C
        PSProvider        : Microsoft.PowerShell.Core\FileSystem
        PSIsContainer     : False
        Age               : 16
        VersionInfo       : File:             C:\WINDOWS\system32\WindowsPow...
                    InternalName:     POWERSHELL
                    OriginalFilename: PowerShell.EXE
	...


      次のコマンドを使用して、ファイルの Age プロパティを表示することもできます。

	  (get-childitem $pshome\powershell.exe).age
          16
 

  Types.ps1xml ファイルの XML

      <Types> タグは、そのファイルに定義されているすべての型を囲むように存在します。
      <Types> タグは 1 対しか存在できません。

      このファイルで言及されている各 .NET Framework 型は、1 対の <Type> タグで表現されます。

      Type タグは、次のタグを含んでいる必要があります。

          <Name>: 対象の .NET Framework 型の名前を囲む 1 対の <Name> タグ。

          <Members>: .NET Framework 型に対して定義された新しいプロパティとメソッドのタグを囲む 1 対の 
                     <Members> タグ。

      <Members> タグ内には、次のメンバー タグを含めることができます。

      <AliasProperty>: 既存のプロパティの新しい名前を定義します。

         <AliasProperty> タグには、新しいプロパティの名前を定義する 1 対の <Name> タグと、既存のプロ
         パティを指定する 1 対の <ReferencedMemberName> タグが必要です。たとえば、Count エイリアス 
         プロパティは、配列オブジェクトの Length プロパティのエイリアスです。

             <Type>
                 <Name>System.Array</Name>
                 <Members>
                     <AliasProperty>
                         <Name>Count</Name>
                         <ReferencedMemberName>Length</ReferencedMemberName>
                     </AliasProperty>
                 </Members>
             </Type>


      <CodeMethod>: .NET Framework クラスの静的メソッドを参照します。

         <CodeMethod> タグには、新しいメソッドの名前を定義する 1 対の <Name> タグと、メソッドの定義
         先のコードを指定する 1 対の <GetCodeReference> タグが必要です。
         たとえば、ディレクトリ (System.IO.DirectoryInfo オブジェクト) の Mode プロパティは、
         Windows 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>

 
      <CodeProperty>: .NET Framework クラスの静的メソッドを参照します。

         <CodeProperty> タグには、新しいプロパティの名前を定義する 1 対の <Name> タグと、プロパティ
         の定義先のコードを指定する 1 対の <GetCodeReference> タグが必要です。
         たとえば、ディレクトリ (System.IO.DirectoryInfo オブジェクト) の Mode プロパティは、
         Windows 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> タグ内に存在する必要があります。このタグは、メンバ
         ー セットの名前を囲む 1 対の <Name> タグと、そのセット内のメンバー (プロパティおよびメソッド) 
         を囲む 1 対のセカンダリ <Members> タグを含んでいる必要があります。プロパティを作成するタグ 
         (<NoteProperty>、<ScriptProperty> など) やメソッドを作成するタグ (<Method>、
         <ScriptMethod> など) はすべて、このセットのメンバーとして追加することができます。

         Types.ps1xml ファイルの <MemberSet> タグは、Windows PowerShell における .NET 
         Framework オブジェクトの既定の表示を定義するために使用されます。この場合、メンバー セットの名
         前 (<Name> タグの値) は常に "PsStandardMembers" になり、プロパティの名前 (<Name> タグの値) 
         は次のいずれかになります。

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

            - DefaultDisplayPropertySet: オブジェクトのプロパティ (1 つまたは複数)。

            - DefaultKeyPropertySet: オブジェクトのキー プロパティ (1 つまたは複数)。キー プロパテ
              ィは、セッション履歴の項目の ID 番号など、プロパティ値のインスタンスを識別するためのプロパテ
              ィです。

         たとえば、次の XML は、Get-Service コマンドレットから返されるサービス 
         (System.ServiceProcess.ServiceController オブジェクト) の既定の表示を定義します。ここで
         は、既定のプロパティ セット (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> タグには、新しいプロパティの名前を定義する 1 対の <Name> タグと、その値を指
         定する 1 対の <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>


      <ParameterizedProperty>: 引数を受け取り、値を返すプロパティです。

      <Properties>: オブジェクトのプロパティのコレクションです。

      <Property>: 基本オブジェクトのプロパティです。

      <PropertySet>: オブジェクトのプロパティのコレクションを定義します。

         <PropertySet> タグには、プロパティ セットの名前を定義する 1 対の <Name> タグと、セット内の
         各プロパティを指定する 1 対の <ReferencedProperty> タグが必要です。プロパティの名前は、1 対の 
         <Name> タグで囲む必要があります。

         Types.ps1xml では、<PropertySet> タグを使用して、オブジェクトの既定の表示に対する一連のプロ
         パティを定義します。既定の表示は、<MemberSet> タグの <Name> タグの値 ("PsStandardMembers") 
         で識別できます。

         たとえば、次の XML は、ディレクトリ (System.IO.DirectoryInfo オブジェクト) の Status プ
         ロパティを作成します。Status プロパティの値は常に "Success" です。

             <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> タグには、新しいメソッドの名前を指定する 1 対の <Name> タグと、メソッドの結
         果を返すスクリプト ブロックを囲む 1 対の <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> タグには、新しいプロパティの名前を指定する 1 対の <Name> タグと、プロパテ
         ィの値を返すスクリプト ブロックを囲む 1 対の <GetScriptBlock> タグが必要です。

         たとえば、ファイル (System.IO.FileInfo objects) の 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>


      詳細については、MSDN (Microsoft Developer Network) ライブラリの「Windows PowerShell 
      SDK」(https://go.microsoft.com/fwlink/?LinkId=144538) を参照してください。


  Update-TypeData
    
      Windows PowerShell コンソールに Types.ps1xml ファイルを読み込むには、Update-TypeData コマ
      ンドレットを使用します。組み込みの Types.ps1xml ファイルに定義されている型よりも、独自に定義したフ
      ァイルの型を優先させる場合は、Update-TypeData の PrependData パラメーターを使用します。Update-
      TypeData は、現在のコンソールにのみ有効です。将来のすべてのコンソールを変更するには、コンソールを
      エクスポートするか、Windows PowerShell プロファイルに Update-TypeData コマンドを追加します。


  Types.ps1xml ファイルの署名

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

関連項目
    about_Signing
    Copy-Item
    Get-Member
    Update-TypeData





目次