次の方法で共有


Add-Member

PowerShell オブジェクトのインスタンスにカスタム プロパティとメソッドを追加します。

構文

Add-Member
   -InputObject <PSObject>
   -TypeName <String>
   [-PassThru]
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-TypeName <String>]
   [-Force]
   [-PassThru]
   [-NotePropertyMembers] <IDictionary>
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-TypeName <String>]
   [-Force]
   [-PassThru]
   [-NotePropertyName] <String>
   [-NotePropertyValue] <Object>
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-MemberType] <PSMemberTypes>
   [-Name] <String>
   [[-Value] <Object>]
   [[-SecondValue] <Object>]
   [-TypeName <String>]
   [-Force]
   [-PassThru]
   [<CommonParameters>]

説明

Add-Member コマンドレットを使用すると、PowerShell オブジェクトのインスタンスにメンバー (プロパティとメソッド) を追加できます。 たとえば、オブジェクトの説明を含む NoteProperty メンバー、またはオブジェクトを変更するスクリプトを実行する ScriptMethod メンバーを追加できます。

Add-Memberを使用するには、オブジェクトをパイプしてAdd-Memberするか、InputObject パラメーターを使用してオブジェクトを指定します。

MemberType パラメーターは、追加するメンバーの種類を示します。 Name パラメーターは新しいメンバーに名前を割り当て、Value パラメーターはメンバーの値を設定します。

追加するプロパティとメソッドは、指定したオブジェクトの特定のインスタンスにのみ追加されます。 Add-Member では、オブジェクトの種類は変更されません。 新しいオブジェクトの種類を作成するには、 Add-Type コマンドレットを使用します。

Export-Clixml コマンドレットを使用して、追加のメンバーを含むオブジェクトのインスタンスをファイルに保存することもできます。 その後、 Import-Clixml コマンドレットを使用して、エクスポートされたファイルに格納されている情報からオブジェクトのインスタンスを再作成できます。

Windows PowerShell 3.0 以降、 Add-Member には、オブジェクトにノート プロパティを簡単に追加できる新機能があります。 NotePropertyName および NotePropertyValue パラメーターを使用してメモ プロパティを定義したり、メモ プロパティの名前と値のハッシュ テーブルを取得する NotePropertyMembers パラメーターを使用したりできます。

また、Windows PowerShell 3.0 以降では、出力オブジェクトを生成する PassThru パラメーターが必要になる頻度が低くなります。 Add-Member では、新しいメンバーが、より多くの型の入力オブジェクトに直接追加されるようになりました。 詳細については、 PassThru パラメーターの説明を参照してください。

例 1: PSObject にメモ プロパティを追加する

次の例では、Test.txt ファイルを表す FileInfo オブジェクトに、値が "Done" のStatus note プロパティを追加します。

最初のコマンドでは、Get-ChildItem コマンドレットを使用して、Test.txt ファイルを表す FileInfo オブジェクトを取得します。 $a変数に保存されます。

2 番目のコマンドは、 $aのオブジェクトに note プロパティを追加します。

3 番目のコマンドでは、ドット表記を使用して、$aのオブジェクトの Status プロパティの値を取得します。 出力が示すように、値は Done

$A = Get-ChildItem c:\ps-test\test.txt
$A | Add-Member -NotePropertyName Status -NotePropertyValue Done
$A.Status

Done

例 2: PSObject にエイリアス プロパティを追加する

次の例では、Test.txt ファイルを表すオブジェクトに Size エイリアス プロパティを追加します。 新しいプロパティは、 Length プロパティのエイリアスです。

最初のコマンドでは、 Get-ChildItem コマンドレットを使用して、 Test.txt FileInfo オブジェクトを取得します。

2 番目のコマンドは、 Size エイリアス プロパティを追加します。 3 番目のコマンドでは、ドット表記を使用して新しい Size プロパティの値を取得します。

$A = Get-ChildItem C:\Temp\test.txt
$A | Add-Member -MemberType AliasProperty -Name Size -Value Length
$A.Size

2394

例 3: StringUse Note プロパティを文字列に追加する

次の使用例は、文字列に StringUse note プロパティを追加します。 Add-MemberString入力オブジェクトに型を追加できないため、PassThru パラメーターを指定して出力オブジェクトを生成できます。 例の最後のコマンドは、新しいプロパティを表示します。

この例では、 NotePropertyMembers パラメーターを使用します。 NotePropertyMembers パラメーターの値はハッシュ テーブルです。 キーは note プロパティ名の StringUse で、値は note プロパティ値の Display です。

$A = "A string"
$A = $A | Add-Member -NotePropertyMembers @{StringUse="Display"} -PassThru
$A.StringUse

Display

例 4: FileInfo オブジェクトにスクリプト メソッドを追加する

次の使用例は、 SizeInMB スクリプト メソッドを、ファイル サイズを最も近い MegaByte に計算する FileInfo オブジェクトに追加します。 2 番目のコマンドは、Round静的メソッドを使用する ScriptBlock[math]型から 2 番目の小数点に丸めるスクリプト ブロックを作成します。

Value パラメーターは、現在のオブジェクトを表す$This自動変数も使用します。 $This変数は、新しいプロパティとメソッドを定義するスクリプト ブロックでのみ有効です。

最後のコマンドでは、ドット表記を使用して、$A変数内のオブジェクトに対して新しい SizeInMB スクリプト メソッドを呼び出します。

$A = Get-ChildItem C:\Temp\test.txt
$S = {[math]::Round(($this.Length / 1MB), 2)}
$A | Add-Member -MemberType ScriptMethod -Name "SizeInMB" -Value $S
$A.SizeInMB()

0.43

例 5: カスタム オブジェクトを作成する

次の使用例は、 Asset カスタム オブジェクトを作成します。

New-Object コマンドレットは、$Asset変数に保存されるPSObjectを作成します。 [ordered]型アクセラレータは、$d変数に格納されている順序付きディクショナリを作成します。 $AssetAdd-Memberにパイプすると、ディクショナリ内のキーと値のペアがオブジェクトNoteProperty メンバーとしてオブジェクトに追加されます。 TypeName パラメーターは、PSObjectAsset型を割り当てます。 Get-Member コマンドレットは、オブジェクトの型とプロパティを示します。 ただし、プロパティは、追加された順序ではなく、アルファベット順に一覧表示されます。

$Asset = New-Object -TypeName PSObject
$d = [ordered]@{Name="Server30"; System="Server Core"; PSVersion="4.0"}
$Asset | Add-Member -NotePropertyMembers $d -TypeName Asset
$Asset | Get-Member -MemberType Properties

TypeName: Asset

Name        MemberType   Definition
----        ----------   ----------
Name        NoteProperty string Name=Server30
PSVersion   NoteProperty string PSVersion=4.0
System      NoteProperty string System=Server Core

$Asset.PSObject.Properties | Format-Table Name, MemberType, TypeNameOfValue, Value

Name        MemberType TypeNameOfValue Value
----        ---------- --------------- -----
Name      NoteProperty System.String   Server30
System    NoteProperty System.String   Server Core
PSVersion NoteProperty System.String   4.0

プロパティの生の一覧を調べると、プロパティがオブジェクトに追加された順序で表示されます。 Format-Table この例では、 Get-Memberのような出力を作成するために使用します。

例 6: AliasProperty をオブジェクトに追加する

この例では、2 つの NoteProperty メンバーを含むカスタム オブジェクトを作成します。 NoteProperty の型は、プロパティに格納されている値の型を反映します。 この場合、 Age プロパティは文字列です。

PS> $obj = [pscustomobject]@{
      Name = 'Doris'
      Age = '20'
}
PS> $obj | Add-Member -MemberType AliasProperty -Name 'intAge' -Value age -SecondValue uint32
PS> $obj | Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType    Definition
----        ----------    ----------
intAge      AliasProperty intAge = (System.UInt32)age
Equals      Method        bool Equals(System.Object obj)
GetHashCode Method        int GetHashCode()
GetType     Method        type GetType()
ToString    Method        string ToString()
Age         NoteProperty  string Age=20
Name        NoteProperty  string Name=Doris

PS> $obj

Name  Age intAge
----  --- ------
Doris 20      20

PS> $obj.Age + 1

201

PS> $obj.intAge + 1

21

intAge プロパティは、Age プロパティのAliasPropertyですが、型はuint32であることが保証されます。

例 7: カスタム オブジェクトに get メソッドと set メソッドを追加する

この例では、深く入れ子になったプロパティにアクセスする Get および Set メソッドを定義する方法を示します。

$user = [pscustomobject]@{
    Name      = 'User1'
    Age       = 29
    StartDate = [datetime]'2019-05-05'
    Position  = [pscustomobject]@{
        DepartmentName = 'IT'
        Role = 'Manager'
    }
}
$addMemberSplat = @{
    MemberType = 'ScriptProperty'
    Name = 'Title'
    Value = { $this.Position.Role }                  # getter
    SecondValue = { $this.Position.Role = $args[0] } # setter
}
$user | Add-Member @addMemberSplat
$user | Get-Member

TypeName: System.Management.Automation.PSCustomObject

Name        MemberType     Definition
----        ----------     ----------
Equals      Method         bool Equals(System.Object obj)
GetHashCode Method         int GetHashCode()
GetType     Method         type GetType()
ToString    Method         string ToString()
Age         NoteProperty   int Age=29
Name        NoteProperty   string Name=User1
Position    NoteProperty   System.Management.Automation.PSCustomObject Position=@{DepartmentName=IT; Role=Manager}
StartDate   NoteProperty   datetime StartDate=5/5/2019 12:00:00 AM
Title       ScriptProperty System.Object Title {get= $this.Position.Role ;set= $this.Position.Role = $args[0] ;}

$user.Title = 'Dev Manager'

Name      : User1
Age       : 29
StartDate : 5/5/2019 12:00:00 AM
Position  : @{DepartmentName=IT; Role=Dev Manager}
Title     : Dev Manager

Title プロパティは、Get および Set メソッドを持つ ScriptProperty であることに注意してください。 Title プロパティに新しい値を割り当てると、Set メソッドが呼び出され、Position プロパティの Role プロパティの値が変更されます。

パラメーター

-Force

既定では、オブジェクトに既に同じメンバーがある場合、 Add-Member は新しいメンバーを追加できません。 Force パラメーターを使用すると、既存のメンバーAdd-Member新しいメンバーに置き換えられます。 Force パラメーターを使用して、型の標準メンバーを置き換えることはできません。

型:SwitchParameter
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-InputObject

新しいメンバーを追加するオブジェクトを指定します。 オブジェクトが格納されている変数を入力するか、オブジェクトを取得するコマンドまたは式を入力します。

型:PSObject
配置:Named
規定値:None
必須:True
パイプライン入力を受け取る:True
ワイルドカード文字を受け取る:False

-MemberType

追加するメンバーの型を指定します。 このパラメーターは必須です。 このパラメーターの有効値は、次のとおりです。

  • AliasProperty
  • CodeMethod
  • CodeProperty
  • NoteProperty
  • ScriptMethod
  • ScriptProperty

これらの値の詳細については、PowerShell SDK の PSMemberTypes 列挙 を参照してください。

すべてのオブジェクトにすべての型のメンバーがあるわけではありません。 オブジェクトに含まれていないメンバー型を指定すると、PowerShell はエラーを返します。

型:PSMemberTypes
Aliases:Type
指定可能な値:AliasProperty, CodeMethod, CodeProperty, NoteProperty, ScriptMethod, ScriptProperty
配置:0
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Name

このコマンドレットが追加するメンバーの名前を指定します。

型:String
配置:1
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-NotePropertyMembers

NoteProperty 名とその値を表すキーと値のペアを含むハッシュテーブルまたは順序付きディクショナリを指定します。 PowerShell でのハッシュ テーブルと順序付きディクショナリの詳細については、「 about_Hash_Tables」を参照してください。

このパラメーターは Windows PowerShell 3.0 で導入されました。

型:IDictionary
配置:0
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-NotePropertyName

メモ プロパティ名を指定します。

このパラメーターは、 NotePropertyValue パラメーターと共に使用します。 このパラメーターは省略可能です。

このパラメーターは Windows PowerShell 3.0 で導入されました。

型:String
配置:0
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-NotePropertyValue

メモ プロパティの値を指定します。

このパラメーターは、 NotePropertyName パラメーターと共に使用します。 このパラメーターは省略可能です。

このパラメーターは Windows PowerShell 3.0 で導入されました。

型:Object
配置:1
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-PassThru

作業中の項目を表すオブジェクトを返します。 既定では、このコマンドレットは出力を生成しません。

ほとんどのオブジェクトでは、 Add-Member 入力オブジェクトに新しいメンバーを追加します。 ただし、入力オブジェクトが文字列の場合、 Add-Member は入力オブジェクトにメンバーを追加できません。 これらのオブジェクトの場合は、 PassThru パラメーターを使用して出力オブジェクトを作成します。

Windows PowerShell 2.0 では、 Add-Member オブジェクトではなく、オブジェクトの PSObject ラッパーにのみメンバーを追加しました。 PassThru パラメーターを使用して、PSObject ラッパーを持つ任意のオブジェクトの出力オブジェクトを作成します。

型:SwitchParameter
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-SecondValue

AliasPropertyScriptProperty、または CodeProperty メンバーに関するオプションの追加情報を指定します。

AliasPropertyを追加するときに使用する場合、このパラメーターはデータ型である必要があります。 指定したデータ型への変換が、 AliasProperty の値に追加されます。 たとえば、文字列プロパティの代替名を提供する AliasProperty を追加する場合、System.Int32SecondValue パラメーターを指定して、対応する AliasProperty を使用してアクセスするときに、その文字列プロパティの値を整数に変換する必要があることを示すこともできます。

CodePropertyの場合、値は Set アクセサーを実装するメソッドへの参照である必要があります。 メソッドへの参照を取得するには、型参照の GetMethod() メソッドを使用します。 メソッドは、 PSObject である 1 つのパラメーターを受け取る必要があります。 Get アクセサーは、Value パラメーターを使用して割り当てられます。

ScriptProperty の場合、値は Set アクセサーを実装するスクリプト ブロックである必要があります。 Get アクセサーは、Value パラメーターを使用して割り当てられます。

型:Object
配置:3
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-TypeName

型の名前を指定します。

型が System 名前空間のクラス、または型アクセラレータを持つ型である場合は、型の短い名前を入力できます。 それ以外の場合は、完全な型名が必要です。 このパラメーターは、 InputObjectPSObject の場合にのみ有効です。

このパラメーターは Windows PowerShell 3.0 で導入されました。

型:String
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Value

追加されたメンバーの初期値を指定します。 AliasPropertyCodeProperty、または ScriptProperty メンバーを追加する場合は、SecondValue パラメーターを使用して追加情報を指定できます。

  • AliasPropertyの場合、値はエイリアス化されるプロパティの名前である必要があります。
  • CodeMethodの場合、値はメソッドへの参照である必要があります。 メソッドへの参照を取得するには、型参照の GetMethod() メソッドを使用します。
  • CodePropertyの場合、値は Get アクセサーを実装するメソッドへの参照である必要があります。 メソッドへの参照を取得するには、型参照の GetMethod() メソッドを使用します。 参考。 メソッドは、 PSObject である 1 つのパラメーターを受け取る必要があります。 Set アクセサーは、SecondValue パラメーターを使用して割り当てられます。
  • ScriptMethod の場合、値はスクリプト ブロックである必要があります。
  • ScriptProperty の場合、値は Get アクセサーを実装するスクリプト ブロックである必要があります。 Set アクセサーは、SecondValue パラメーターを使用して割り当てられます。
型:Object
配置:2
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

入力

PSObject

任意のオブジェクトをこのコマンドレットにパイプできます。

出力

None

既定では、このコマンドレットは出力を返しません。

Object

PassThru パラメーターを使用すると、このコマンドレットは新しく拡張されたオブジェクトを返します。

メモ

メンバーは、 PSObject 型オブジェクトにのみ追加できます。 オブジェクトが PSObject オブジェクトかどうかを確認するには、 -is 演算子を使用します。 たとえば、 $obj 変数に格納されているオブジェクトをテストするには、「 $obj -is [psobject]」と入力します。

PSObject 型オブジェクトは、メンバーがオブジェクトに追加された順序でメンバーのリストを保持します。

MemberTypeNameValue、および SecondValue パラメーターの名前は省略可能です。 パラメーター名を省略する場合、名前のないパラメーター値は、 MemberTypeNameValue、および SecondValue の順に指定する必要があります。

パラメーター名を指定する場合は、パラメーターの順序に決まりはありません。

$this自動変数は、新しいプロパティとメソッドの値を定義するスクリプト ブロックで使用できます。 $this変数は、プロパティとメソッドが追加されるオブジェクトのインスタンスを参照します。 $this変数の詳細については、about_Automatic_Variablesを参照してください。