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>]

说明

cmdlet Add-Member 允许将成员 (属性和方法) 添加到 PowerShell 对象的实例。 例如,可以添加一个 NoteProperty 成员,该成员包含对象的说明或运行脚本以更改对象的 ScriptMethod 成员。

若要使用 Add-Member,请将对象通过管道传递给 Add-Member,或使用 InputObject 参数指定对象。

MemberType 参数指示要添加的成员的类型。 Name 参数为新成员分配名称,Value 参数设置成员的值。

你添加的属性和方法只会添加到你指定的对象的特定实例中。 Add-Member 不会更改对象类型。 若要创建新的对象类型,请使用 Add-Type cmdlet。

还可以使用 Export-Clixml cmdlet 将 对象的实例(包括其他成员)保存在文件中。 然后, Import-Clixml 可以使用 cmdlet 根据导出文件中存储的信息重新创建 对象的实例。

从 Windows PowerShell 3.0 开始,Add-Member新增了一些新功能,使向对象添加笔记属性变得更加容易。 可以使用 NotePropertyNameNotePropertyValue 参数定义附注属性,或使用 NotePropertyMembers 参数,该参数采用包含附注属性名称和值的哈希表。

此外,从 Windows PowerShell 3.0 开始,将很少需要使用用于生成输出对象的 PassThru 参数。 Add-Member 现在,将新成员直接添加到更多类型的输入对象。 有关详细信息,请参阅 PassThru 参数说明。

示例

示例 1:将 note 属性添加到 PSObject

以下示例将值为“Done” 的 Status note 属性添加到 FileInfo 对象中,该对象表示该文件 Test.txt

第一个命令使用 Get-ChildItem cmdlet 获取表示文件的 Test.txtFileInfo 对象。 它将它保存在 变量中 $a

第二个命令将 note 属性添加到 中的 $a对象。

第三个命令使用点表示法获取 中 $a对象的 Status 属性的值。 如输出所示,值为“Done”。

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

Done

示例 2:将别名属性添加到 PSObject

以下示例将 Size 别名属性添加到表示 Test.txt 文件的 对象。 新属性是 Length 属性的别名。

第一个命令使用 Get-ChildItem cmdlet 获取 Test.txtFileInfo 对象。

第二个命令添加 Size 别名属性。 第三个命令使用点表示法获取新的 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-Member 无法向 String 输入对象添加类型,因此可以指定 PassThru 参数来生成输出对象。 示例中的最后一个命令将显示新属性。

此示例使用 NotePropertyMembers 参数。 NotePropertyMembers 参数的值是一个哈希表。 键是 note 属性名称 StringUse,值是 note 属性值 Display

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

Display

示例 4:向 FileInfo 对象添加脚本方法

本示例将 SizeInMB 脚本方法添加到 FileInfo 对象, 该对象将文件大小计算为最接近的兆字节。 第二个命令创建 一个 ScriptBlock,该脚本块 使用类型中的 Round 静态方法 [math] 将文件大小舍入到第二位小数点。

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:将对象的所有属性复制到另一个对象

此函数将一个对象的所有属性复制到另一个对象中。

循环 foreach 使用 Get-Member cmdlet 获取 From 对象的每个属性。 循环中的 foreach 命令在每个属性上按序列执行。

命令Add-MemberFrom 对象的 属性作为 NoteProperty 添加到 To 对象。 使用 Value 参数复制 。 它使用 Force 参数添加具有相同成员名称的成员。

function Copy-Property ($From, $To)
{
    $properties = Get-Member -InputObject $From -MemberType Property
    foreach ($p in $properties)
    {
        $To | Add-Member -MemberType NoteProperty -Name $p.Name -Value $From.$($p.Name) -Force
    }
}

示例 6:Create自定义对象

此示例创建 一个 Asset 自定义对象。

cmdlet New-Object 创建 PSObject。 该示例将 PSObject 保存在 变量中 $Asset

第二个命令使用 [ordered] 类型加速器创建名称和值的有序字典。 命令将结果保存在 变量中 $D

第三个命令使用 cmdlet 的 Add-MemberNotePropertyMembers 参数将变量中的$D字典添加到 PSObjectTypeName 属性将新名称 Asset 分配给 PSObject

最后一个命令将新的 Asset 对象传递给 Get-Member cmdlet。 输出显示对象的类型名称为 Asset ,以及我们在有序字典中定义的笔记属性。

$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

TypeName: Asset

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Name        NoteProperty System.String Name=Server30
PSVersion   NoteProperty System.String PSVersion=4.0
System      NoteProperty System.String System=Server Core

参数

-Force

指示此 cmdlet 添加一个新成员,即使对象具有同名的自定义成员。 不能使用 Force 参数替换类型的标准成员。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

指定要向其添加新成员的对象。 输入一个包含对象的变量,或键入可获取对象的命令或表达式。

Type:PSObject
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-MemberType

指定要添加的成员的类型。 此参数是必需的。 此参数的可接受值为:

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

有关这些值的信息,请参阅 PowerShell SDK 中的 PSMemberTypes 枚举

并非所有对象都具有每种类型的成员。 如果指定对象不具有的成员类型,PowerShell 将返回错误。

Type:PSMemberTypes
Aliases:Type
Accepted values:AliasProperty, CodeProperty, Property, NoteProperty, ScriptProperty, Properties, PropertySet, Method, CodeMethod, ScriptMethod, Methods, ParameterizedProperty, MemberSet, Event, Dynamic, All
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Name

指定此 cmdlet 添加的成员的名称。

Type:String
Position:1
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-NotePropertyMembers

指定附注属性名称和值的哈希表或有序字典。 键入哈希表或字典,其中的键为附注属性名称,值为附注属性值。

有关 PowerShell 中的哈希表和有序字典的详细信息,请参阅 about_Hash_Tables

已在 Windows PowerShell 3.0 中引入了此参数。

Type:IDictionary
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-NotePropertyName

指定注释属性名称。

将此参数与 NotePropertyValue 参数一起使用。 此参数是可选的。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-NotePropertyValue

指定 note 属性值。

将此参数与 NotePropertyName 参数一起使用。 此参数是可选的。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:Object
Position:1
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-PassThru

返回一个代表你所处理的项目的对象。 默认情况下,此 cmdlet 将不产生任何输出。

对于大多数对象, Add-Member 将新成员添加到输入对象。 但是,当输入对象为字符串时, Add-Member 无法将 成员添加到输入对象。 对于这些对象,请使用 PassThru 参数来创建输出对象。

在 Windows PowerShell 2.0 中,Add-Member仅向 对象的 PSObject 包装器添加了成员,而不添加到 对象。 使用 PassThru 参数为具有 PSObject 包装器的任何对象创建输出对象。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SecondValue

指定有关 AliasPropertyScriptPropertyCodePropertyCodeMethod 成员的可选附加信息。

如果在添加 AliasProperty 时使用此参数,则此参数必须是数据类型。 将到指定数据类型的转换添加到 AliasProperty 的值中。

例如,如果添加为字符串属性提供备用名称的 AliasProperty,则还可以指定 System.Int32SecondValue 参数,以指示在使用相应的 AliasProperty 访问该字符串属性的值时应转换为整数。

添加 ScriptProperty 成员时,可以使用 SecondValue 参数指定其他 ScriptBlock。 Value 参数中指定的第一个 ScriptBlock 用于获取变量的值。 SecondValue 参数中指定的第二个 ScriptBlock 用于设置变量的值。

Type:Object
Position:3
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TypeName

指定类型的名称。

当类型是 System 命名空间中的类或具有类型加速器的类型时,可以输入该类型的短名称。 否则,必须输入完整类型名称。 仅当 InputObjectPSObject 时,此参数才有效。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Value

指定已添加成员的初始值。 如果添加 AliasPropertyCodePropertyScriptPropertyCodeMethod 成员,可以使用 SecondValue 参数提供可选的附加信息。

Type:Object
Position:2
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

输入

PSObject

可以通过管道将任何对象类型传递给此 cmdlet。

输出

None or System.Object

使用 PassThru 参数时,此 cmdlet 将返回新扩展的对象。 否则,此 cmdlet 将不生成任何输出。

备注

只能将成员添加到 PSObject 对象。 若要确定对象是否为 PSObject 对象,请使用 -is 运算符。

例如,若要测试变量中 $obj 存储的对象,请键入 $obj -is [PSObject]

MemberTypeNameValueSecondValue 参数的名称是可选的。 如果省略参数名称,则未命名的参数值必须按以下顺序显示: MemberTypeNameValueSecondValue

如果包括参数名称,则参数能够以任何顺序出现。

可以在定义新属性和方法值的脚本块中使用 $this 自动变量。 变量 $this 引用要向其添加属性和方法的 对象的实例。 有关变量 $this 的详细信息,请参阅 about_Automatic_Variables